Run a script on startup in a detached screen on a Raspberry Pi
This document explains how to run a script every time you startup your Raspberry Pi and how to get access to the screen running it. This applies to any UNIX system.
The script can contain anything. For this example, we'll use a script /home/pi/startup
. It could look something like this
#!/usr/bin/bash
# Start my node project
cd ~/node/myproject && npm start
Make sure it's executable
chmod +x ~/startup
Configure the startup script
Install screen
sudo apt-get install screen
Edit the root startup script file
sudo nano /etc/rc.local
And the following line before exit 0
# Run a command as `pi` from the home folder
# in a screen named `pistartup`
su - pi -c "screen -dm -S pistartup ~/startup"
We make use of two very convenient flags. As the man page explains:
-d -m Start screen in "detached" mode. This creates a new session but doesn't attach to it. This is useful for system startup scripts.
Reboot for effect
sudo reboot
Yay, it runs the script on startup! What now?
The true niceness happens when you ssh into your Raspberry Pi
ssh pi@raspberry.local
and get to look at the script running!
screen -DR
Google for instructions on how to use screen, or check this quick reference I found when I did myself.
BONUS: How do we make this even more tasty?
Screen allows us to open multiple tabs. Say I were to have two long running socket server scripts that I wanted to run separately. I can open 2 tabs, give them a name and start the processes like so:
# /home/pi/startup
#
# screen -t <title> <tab-index> <command>
screen -t socket-local 0 forever /home/pi/socket-local/server.js
screen -t socket-remote 1 forever /home/pi/socket-remote/server.js
Written by Jesse the Game
Related protips
4 Responses
This is super useful. This is how I run minecraft server.
This is a nice setup, however it will not run for me because the su command is asking for a password. Any way around this?
i have tried this but will not run my script on boot or when running the rc.local from prompt.
It shows the ip as in it but not my screen command it looks like this
execute it set
root@raspberrypi:~# ls -lasi /etc/rc.local
523710 4 -rwxr-xr-x 1 root root 538 Jun 21 08:04 /etc/rc.local
rc.local looks like this
!/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.
Print the IP address
IP=$(hostname -I) || true
if [ "$IP" ]; then
printf "My IP address is %s\n" "$_IP"
fi
screen -d -m -S cgminer /home/pi/chminer/cgminer -c /home/pi/cgminer.conf
exit 0
what do i have wrong the screen works by hand but need it to start on boot
regards
This did not work for me because su asked for password. However, I was able to solve that by changing the command to
sudo su - pi -c "screen -dm -S pistartup ~/startup"