Oftentimes I will encounter programs that weren’t necessarily designed to be automatically run that I want to run on startup. Sometimes that program will have interactive information that you will want to see later, but you still want it to run on startup.
The solution to this particular problem is using screen in combination with su and bash. In my situation, I want to run the HDSurfer plugin on bootup as a different user. The solution I came up is as follows (thanks to superuser.com and stackoverflow.com for the guidance I needed to set this up.)
Screen is like having a separate X window session to keep a program running, except it is for console programs. You can attach and detach to this screen whenever you’d like and not worry about the program terminating.
sudo apt-get install screen
Create a script to run your program with all required arguments
In my case I needed to execute the command “python /usr/bin/HDSurferWave/hdsurferwave.py start” as a different user in a screen session (so it wouldn’t terminate when the terminal session did.) To do this,
- invoke screen with the -dm command (to begin the program in detached mode)
- issue the bash -c argument afterward to invoke bash
- Include your desired command after that
My one line script looks like this:
screen -dm bash -c "python /usr/bin/HDSurferWave/hdsurferwave.py start"
Run your script
I use the su command with the -c argument to change the user that will be running the script, as the startup script launches things as root by default (with pre-systemd systems, anyway.) The -s command initiates a shell to launch, and the last argument is the user you want to run as. My launch argument is:
su -c "/usr/bin/HDSurferWave/start.sh" -s /bin/sh nicholas
Configure the script to run on startup
Edit /etc/rc.local and add your script command from above, then mark that file as executable by running chmod +x /etc/rc.local. Note: This will not work with systems using systemd.
One thought on “Using screen to run interactive programs at startup”