Run script from GRUB menu entry - linux-kernel

I have created a Debian Live DVD following the excellent guide https://willhaley.com/blog/custom-debian-live-environment/.
I would like to be able to great two grub menu enteries when selected auto login and run a script.
menuentry "Run Script 1" {
linux /vmlinuz boot=live quiet nomodeset
initrd /initrd
}
menuentry "Run Script 2" {
linux /vmlinuz boot=live quiet nomodeset
initrd /initrd
}
How can I pass from grub menu entry the absolute path of a script to run when I auto login as root?
/lib/live/mount/medium/scripts/script1.bash
To auto login I have modified /lib/systemd/system/getty#.service to auto login as root using the above menu items.

Boot with a custom parameter:
linux /vmlinuz .... my_dummy_param=/lib/live/mount/medium/scripts/script1.bash
Then later read /proc/cmdline and parse it in your login shell startup files, ex. in .bashrc for bash shells or .profile:
#!/bin/bash
. /proc/cmdline
echo "Running $my_dummy_param"
"$my_dummy_param"

Related

How to launch WSL as if I've logged in?

I have a WSL Ubuntu distro that I've set up so that when I login 4 services start working, including a web API that I can test via Swagger to verify it is up and working.
I'm at the point where what I want to do now is start WSL via a script - that is, launch my distro, have all of the services start, and do it from Python. The problem is I cannot even figure out the correct syntax to get WSL to start from PowerShell in a manner where my services start.
Side note: "services" != systemctl (or similar) calls, but just executing bash CLI commands from either my .bashrc or .profile at login.
I've put the commands to execute in .profile & .bashrc. I've configured it both for root execution and non-root user execution. I've taken the commands out of those 2 files and put it into a script in the Windows file system that I pass in on the start of wsl. And I've put that shell script in the WSL file system as well. Nothing seems to work, and sometimes the distro starts and then stops after about 30 seconds.
Some of the PS CLI commands I've tried:
Start-Job -ScriptBlock{ wsl -d distro -u root }
Start-Job -ScriptBlock{ wsl -d distro -u root 'bash -i -l -c /root/bin/start.sh'
Start-Job -ScriptBlock{ wsl -d distro -u root 'bash -i -l -c .\start.sh'
wsl -d distro -u root -- bash -i -l -c /root/bin/start.sh
wsl -d distro -u root -- bash -i -l -c .\start.sh
wsl -d distro -u root -- /root/bin/start.sh
Permutations of the above that I've tried: replace root with my default login, and turning all of the Start-Job bash options into a comma-separated list of single-quoted strings (Ex: 'bash', '-i', '-l', ... ). Nothing I launch from the CLI will allow me access to the web API that is supposed to be hosted on my distro.
Any advice on what to try next?
Not necessarily an answer here as much as troubleshooting tips which will hopefully lead to an answer:
First, most of the forms that you are using seem to be correct. The only ones that absolutely shouldn't work are those that attempt to run the script from the Windows filesystem.
Make sure that you have a shebang line starting your script. I'm assuming you do, but other readers may come across this as well. For the moment, try this form:
#!/usr/bin/env -S bash -li
That's going to have the same effect as the bash -li you tried -- It will source both both interactive startup files such as ~/.bashrc as well as login profiles such as ~/.bash_profile (and /etc/profile.d/*, etc.).
Note that preferably, you won't need the -li. Best practice would be to move anything necessary for the services over from the startup scripts to your start.sh script, and avoid parsing the profile and rc. I need to go update some of my answers, since I just realized I've been guilty of giving some potentially bad advice ...
Specifically, though, I'm wondering if your interactive Bash config has something truly, well, "interactive" in it that might be preventing the automatic running of the script itself. Again, best practice would be for ~/.bashrc to only hold configuration that is needed for interactive shell sessions.
Make sure the script is set as executable (chmod +x start.sh). Again, I'm assuming this is the case for you.
With a shebang line and an executable script, use something like:
wsl -d distro -u root -e /root/bin/start.sh
The -e tells WSL to launch the script directly. Since it has a shebang line, it will be parsed by Bash. Most of the other forms you use above actually run Bash twice - Once when launching WSL and another when it finds the shebang line in the script.
Try some basic troubleshooting for your script like:
Add set -x to the top (right under the shebang line) to turn on script debugging.
Add a ps -efH at the end to show the processes that are running when the script completes
If needed, resort to quick-and-dirty echo statements to show where things have progressed in the script.
I'm hopeful that the above will at least show you the problem, but if not, add the debugging info that you gain from this to your question, and we can troubleshoot further.

/etc/rc.local is missing from my headless ubuntu 18.04

I am currently hosting a minecraft server on ubuntu server 18.04 LTS. I have a .sh script to start the server's java file, and I would like to run it at startup so that the minecraft server starts when the physical server boots. I wished to do this via /etc/rc.local. However, I do not see rc.local in that location.
Is it in a different location for this version of ubuntu, or is there an entirely different method I should use to run this .sh at startup?
There is no "/etc/rc.local" file on Ubuntu 18.04, but you can create it.
Create the file with a text editor:
sudo nano /etc/rc.local
Paste the following lines and replace "COMMANDS" with the commands to be executed at system startup:
#!/bin/sh -e
COMMANDS
exit 0
Add the execute permission on the file:
chmod +x /etc/rc.local
Set a crontab for this
Make sure the file is executable:
chmod +x /path_to_you_file/your_file/file.sh
To edit crontab file:
crontab -e
Then add this:
#reboot /path_to_you_file/your_file/file.sh
rc.local is disabled by default.
Enable by using this command
sudo systemctl enable rc-local.service

Editing crontab using a script

I am trying to write an embedded application upgrade script. I am running my application on Ubuntu on Beaglebone Black.
Right not, I am launching my application on power-up. To do this, I am running launch.sh script in crontab.
This script is as mentioned below:
until /root/aa_main; do
echo "Application aa_main crashed with exit code $?. Respawning.." >&2
echo "Crashed! $(date)" >> crashlog.txt
sudo sync
sudo reboot
done
It basically, reboots the system if my application crashes, and crontab launches the application again on reboot.
The problem is that if I want to update the application. I have to perform following steps:
Disable launching of the above script with crontab -e
Reboot
Copy and replace aa_main
Enable launching of the same script with crontab -e
Reboot
I want to automate this process. How can I do it?
Is it possible to edit crontab using a script?
Thanks in advance
You can use crontab command's other options to copy the crontab to a file, modify it and install the modify version from a script:
crontab -l would list the current crontab file, you can redirect this to a file of your choice and modify it
crontab <filename> would install the file specified by <filename> as the new crontab - use this option with your modified file and you'll get the new modified crontab

Execute command if su to a certain user

If I enter sudo su - Rorschach and login as Rorscach. I would like a command to be executed automatically.
Such as echo "Hello Rorschach" or cd ~
Where do I put these scripts in order for them to be performed upon login of that user?
I am using an ubuntu 14.04 command line and echo $0 outputs -bash
~/.bash_profile (recommended) or ~/.bashrc (will work, but this file should rather contain functions and aliases, not commands).
As far as message after login is concerned you can write at /etc/motd file which I think is the recommended file.
/etc/motd is not a script but a text file which contents are shown before the first prompt of a login session.
motd: message of the day

rc.local file not working raspberry pi

This is the contents of my /etc/rc.local file. It is supposed to run on login on my raspberry pi, yet it just logs in in (as I'm using auto login) and then does nothing, i.e. it just sits there with pi#raspberrypi ~$_ waiting for a command. I have no idea why it's not working nor any experience with bash scripts.
It should mount a usb then run a file on said usb but it doesn't.
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
sudo /bin/mount /dev/sda1 /media/robousb
sudo python media/robousb/Robopython/usercode_old.py
exit 0
I assuming you're running Raspbian, which is pretty much Debian.
rc.local runs as root before login, so you don't need or want sudo; it may be causing an error, hence nothing happening.
User-level commands that run for any user when they log in (unlike rc.local, which runs before login) can be put into /etc/bash.bashrc. That may be more applicable to your situation, at least the second command.
Login commands for the pi user only can be put into /home/pi/.bashrc
I don't know raspberry-pi but you could try to write something into a file to see if the file is running or not. For example :
touch /tmp/test.txt
echo "$(date) => It's running" > /tmp/test.txt
If it doesn't work, I know that on some OS (fedora, rhel, centos for example), the path of that file is /etc/init.d/rc.local. It doesn't cost anything to try this path ;)
I have the exact same problem with RPi3/Jessie.
I suggest you to launch your script in the bashrc by doing
sudo emacs /home/pi/.bashrc
In my case i wrote at the EOF:
bash /home/pi/jarvis/jarvis.sh -b &
And that works well at each startup.
I have the same problem. In Raspbian forum is the solution:
Just change the first row from #!/bin/sh -e to
#!/bin/bash
Ivan X is right. You donĀ“t need sudo command.

Resources