I am trying to execute a script when my Raspberry Pi boots up. I would like the web browser to open up automatically.
I have tried to find a simple solution, (like dropping my script in some "startup" directory or something similar) but I am not seeing anything like that.
I have looked into Upstart, but I'm struggling to grasp how that works. Any scripts I've tried have not worked when I test them out.
12 Answers 12
This Answer is obsolete - and contains methods which were WRONG even when it was written.
Unfortunately this still gets flagged as a Suggestion by StackOverflow.
For running Midori on startup, take a look at this tutorial. For DIY solutions, read on.
You can add your script executable command to the bottom of .bashrc
that will run your script every time open a terminal (or run a new instance of bash
).
Make sure you are in the
pi
folder:$ cd ~
Create a file and write a script to run in the file:
$ sudo nano superscript
Save and exit: Ctrl+X, Y, Enter
Open up
.bashrc
for configuration:
.bashrc
is NOT intended to run scripts.It is run each time a non-login interactive shell is started and is used to configure the shell.
~/.bashrc: executed by bash(1) for non-login shells
.
$ sudo nano .bashrc
Scroll down to the bottom and add the line:
./superscript
Save and exit: Ctrl+X, Y, Enter
If you are looking for a solution that works on bootup to the console, take a look at this link. Basic rundown:
Create a file for your startup script and write your script in the file:
$ sudo nano /etc/init.d/superscript
Save and exit: Ctrl+X, Y, Enter
Make the script executable:
$ sudo chmod 755 /etc/init.d/superscript
Register script to be run at startup:
$ sudo update-rc.d superscript defaults
If you want a script to run when you boot into the LXDE environment, you could take a look at this Raspberry Pi forum post:
Navigate to
~/.config/lxsession/LXDE-pi
Open the
autostart
file in that folder:$ sudo nano autostart
Add
@midori
on a new line. If you want to run something like a python script, put something like@python mypython.py
on a new line. Running a script file would be@./superscript
, but for some reason the script runs in an infinite loop (perhaps this will stop that).Save and exit: Ctrl+X, Y, Enter
Restart your Raspberry Pi into the LXDE environment.
-
1The tutorial on setting up Midori on startup was just what I was looking for. Not sure why there are so many ways to do such a simple thing, but I'm glad it's working now.Tyler Murry– Tyler Murry2013年08月02日 01:44:08 +00:00Commented Aug 2, 2013 at 1:44
-
2@syb0rg The run at login part works like a charm (+1) if I log in via ssh, but not when the lxde desktop session starts. is there a way to do that ?George Profenza– George Profenza2013年09月13日 19:50:15 +00:00Commented Sep 13, 2013 at 19:50
-
1@GeorgeProfenza When you do
$ sudo startx
?syb0rg– syb0rg2013年09月13日 23:01:52 +00:00Commented Sep 13, 2013 at 23:01 -
3Just wanted to point out that the pyhton script will run, but if there are any errors, it will just be somewhere in the background using the /etc/xdg/lxsession/LXDE/autostart method. using .barshrc will reveal errors as well, but it's really important to make sure the script is tight in the first place (found that out the hard way :) )George Profenza– George Profenza2013年09月25日 01:23:16 +00:00Commented Sep 25, 2013 at 1:23
-
9
.bashrc
is not read when the system boots or when a user logs in, only when opening a new terminal (and it's read each time the user opens a new terminal). I'm baffled that this answer got so many upvotes: the first part is plain wrong. The third part is correct to execute a GUI program.Gilles 'SO- stop being evil'– Gilles 'SO- stop being evil'2016年07月15日 01:19:02 +00:00Commented Jul 15, 2016 at 1:19
The way that I've seen most people do it (have a look on the Raspberry Pi forums), and have done myself with success is using /etc/rc.local
.
All you need to do here is put ./myscript
in the rc.local text file. If it's in python, put python myscript.py
.
This literally is "a simple solution, (like dropping my script in some "startup" directory or something similar)"- maybe search on the forums when you're having questions as well, this solution came up on the first 4 results of a google search!
-
9FYI the rc.local by default has various comments about the script doing nothing and needing executable bits changed. This is not true just enter the command for your script before the exit 0 and it will run on startup. Make sure your script exits of runs in the background or it will block the login prompt. Yes, thats what I did.rob– rob2014年11月20日 22:41:06 +00:00Commented Nov 20, 2014 at 22:41
-
See raspberry-projects.com/pi/pi-operating-systems/raspbian/…George Birbilis– George Birbilis2015年07月03日 17:40:55 +00:00Commented Jul 3, 2015 at 17:40
-
@rob Do you mean they suggest the script to be set as executable? This is mitigated in the question by running the script by the command
python myscript.py
. If you want to chmod +x it and add#! /bin/python
, you can run the script by doing$pathtofile/myscript.py
where$pathtofile
is.
if you're in the same directory or the absolute or relative path to the file.jfa– jfa2015年10月29日 08:46:57 +00:00Commented Oct 29, 2015 at 8:46 -
2That's no good for a GUI program such as a browser.
/etc/rc.local
is only to start system services (programs that don't have a user interface).Gilles 'SO- stop being evil'– Gilles 'SO- stop being evil'2016年07月15日 01:19:48 +00:00Commented Jul 15, 2016 at 1:19 -
1@ErickM.Sprengel Use one of the correct answers on this thread, such as this one.Gilles 'SO- stop being evil'– Gilles 'SO- stop being evil'2017年09月02日 19:19:18 +00:00Commented Sep 2, 2017 at 19:19
Add it to the crontab
The crontab runs commands at defined times.
Edit the file:
sudo crontab -e
Add line to file (here a python script):
@reboot python3 /home/pi/Desktop/exemple.py &
-
3To be a little nitpicking here, technically it's not crontab that runs the command, but anyways. With regard to the listed line to add, it is advisable to put full paths for the commands defined here (in this case the full path to
python3
), see here2016年03月28日 20:39:03 +00:00Commented Mar 28, 2016 at 20:39 -
This is the method I've always used due to it's simplicity. +1Patrick Cook– Patrick Cook2016年05月07日 19:42:53 +00:00Commented May 7, 2016 at 19:42
-
That's no good for a GUI program such as a browser.
/etc/rc.local
is only to start programs that don't have a user interface.Gilles 'SO- stop being evil'– Gilles 'SO- stop being evil'2016年07月15日 01:20:03 +00:00Commented Jul 15, 2016 at 1:20 -
3After spending way to much time trying to get it working with rc.local and init.d and all sorts of other stuff.. this worked straight away! Thanks allot!Piotr Kula– Piotr Kula2017年12月01日 14:58:30 +00:00Commented Dec 1, 2017 at 14:58
-
4this doesnt work for some reason in rpi osDenis– Denis2018年07月20日 10:27:54 +00:00Commented Jul 20, 2018 at 10:27
Autostarting xorg apps
If the script you want to start requires an xorg session then you might try following the freedesktop autostart spec which might or might not work depending on which desktop environment you are using.
Alternatively, you can target your specific desktop environment as described at https://wiki.archlinux.org/index.php/autostarting.
Running a script as a systemd service
If your script fits the description of a daemon or a 'service', and your system is running systemd which is the case for raspbian and most modern linuces, then you can configure your script to run as a systemd service — this provides granular control over the lifecycle and execution environment, as well as preconditions for (re)starting the script, such as the network being up and running. It is also possible to configure the service restart in case of failure (Restart=always
, and delay between restarting e.g. RestartSec=10
).
For system-wide use create your systemd unit file under /etc/systemd/system
, e.g. with vim /etc/systemd/system/autossh.service
:
[Unit]
Description=Autossh keepalive daemon
## make sure we only start the service after network is up
Wants=network-online.target
After=network.target
[Service]
## use 'Type=forking' if the service backgrounds itself
## other values are Type=simple (default) and Type=oneshot
Type=forking
## here we can set custom environment variables
Environment=AUTOSSH_GATETIME=0
Environment=AUTOSSH_PORT=0
ExecStart=/usr/local/bin/ssh-keep-alive.sh
ExecStop=/usr/bin/killall -9 autossh
### NOTE: you can have multiple `ExecStop` lines
ExecStop=/usr/bin/killall ssh
# don't use 'nobody' if your script needs to access user files
# (if User is not set the service will run as root)
#User=nobody
# Useful during debugging; remove it once the service is working
StandardOutput=console
[Install]
WantedBy=multi-user.target
See also:
Now we are ready to test the service:
systemctl start autossh
Checking the status of the service:
systemctl status autossh
Stopping the service:
systemctl stop autossh
Once you verified that the service works as expected enable it with:
systemctl enable autossh
NOTE: For security purposes
systemd
will run the script in a restricted environment, similar to howcrontab
scripts are run, therefore don't make any assumptions about pre-existing system variables. Use theEnvironment
keys if your script needs specific variables to be defined. Addingset -x
at the top of your bash script and then runningsystemctl status my_service
might help identify why your script is failing. As a rule of tumb, always use absolute paths for everything includingecho
andcat
, or explicitly define your $PATH.
I want to throw in my two cents, even though this is an old question but commonly asked to do simple thing - autostart. I tried all the suggested solutions in all the answers for this question. NONE of them worked for me. I am using Raspberry PI Model 2 with Raspbian.
The only way I could get my application to autostart successfully is through a script as follows. I say successfully because my application started as expected without having any issue like starting with wrong work path.
1.Create an empty file with extension .sh and name it whatever you want.
2.Copy and Paste the following EXACTLY except change "your application name" to the script name that you just created.
#! /bin/sh
### BEGIN INIT INFO
# Provides: noip
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Simple script to start a program at boot
### END INIT INFO
#change /direct/path/to/your/application to the path your application is in.
cd /direct/path/to/your/application # example cd /home/pi/myprogram/
#change YourProgramExactName to Exact name of your program that you want to auto start
./YourProgramExactName
exit 0
Then, save the script file within your application folder
Then, open
/home/pi/.config/autostart
folder. It might be different in your case. Just open your home folder and enable view hidden folders. open.config/autostart
. If you don't see autostart folder, then create a folder called autostart within .config folder.within autostart folder you will need to create a shortcut to your script file that you created as follows. Create an empty file with extension
.desktop
.Copy and paste the following in the empty desktop file except you will need to change
Comment
,Name
,Exec
,Path
andIcon
field's value.[Desktop Entry] Comment= Exec=/path/to/Your/application/Name-of-the-script-file (.sh) Icon=/Path/to/Your/application/Icon/IconName Name=YourApplicationEXACTNAME Path=/Path/to/Your/Application-ONLY Type=Application
Save and close the file after changing all the necessary fields. You are done. Just test it out.
- note : this makes the script Debian LSBInit compliant: https://wiki.debian.org/LSBInitScripts
-
Technically this script is run by the system rather than by a specific user - so perhaps your application better belongs in
/usr/local/bin/ApplicationName
...?SlySven– SlySven2017年02月11日 11:36:42 +00:00Commented Feb 11, 2017 at 11:36 -
@SlySven "the system" is a specific user.lmat - Reinstate Monica– lmat - Reinstate Monica2018年11月13日 11:17:45 +00:00Commented Nov 13, 2018 at 11:17
-
Is it run as root (UID = 0) or the pi user (UID ~ 500 or 1000 IIRC) - if it is run as root or another system UID (less than 500) then it is traditionally good practice to store the script file (or any that it depends on) on the root device so that should there be a problem with any other device (e.g.
home
if that is a separate device) there will not be a problem with the script (or an executable) file being unavailable when the system fails back to a single user/bin/sh
shell! Nowadays thesystemd
way is to mount both/
and/usr
before PID 1 is started...SlySven– SlySven2018年12月11日 22:23:58 +00:00Commented Dec 11, 2018 at 22:23
I also had trouble with this. On the Raspberry Pi3 running Raspbian this is what I did:
- Create a startup shell script in your root directory (I named mine "launch"):
sudo leafpad launch.sh
- Save the file
- Edit the LXDE-pi autostart file
sudo leafpad /home/pi/.config/lxsession/LXDE-pi/autostart
- Add this to the bottom of that file
./launch.sh
- reboot
-
Don't do this, the command might break boot if it's long runningKaan Soral– Kaan Soral2020年06月28日 16:11:23 +00:00Commented Jun 28, 2020 at 16:11
-
This is what happens: raspberrypi.org/forums/… This is how you fix it: raspberrypi.stackexchange.com/a/70527/121533Kaan Soral– Kaan Soral2020年06月28日 16:34:28 +00:00Commented Jun 28, 2020 at 16:34
NEW METHOD - RASPBERRY PI OS.
This should work on other versions too.
Create a desktop file
xyz.desktop
type the following into it
[Desktop Entry]
Encoding=UTF-8
Type=Application
Name=<Application Name Goes here>
Comment=
Exec= python /home/pi/Desktop/execute_on_boot.py
StartupNotify=false
Terminal=true
Hidden=false
paste this file into the
/home/pi/.config/autostart/
and restart your raspberry pi and it should automatically run your program in a new terminal.
OLD METHOD - RASBIAN STRETCH On the Raspberry Pi3 running Raspbian Stretch this is what I did:
Edit the LXDE-pi autostart file
sudo nano /home/pi/.config/lxsession/LXDE-pi/autostart
Add this to the bottom of that file
@sudo python3 /path/to/your/script.py
save & reboot
-
Don't do this, the command might break boot if it's long running - you'll need to manually fix it by booting into command line :(Kaan Soral– Kaan Soral2020年06月28日 16:11:46 +00:00Commented Jun 28, 2020 at 16:11
-
Actually this method is not supported in Raspberry Pi OS, will edit my answer with updated info.Amr Sohil– Amr Sohil2020年06月29日 21:20:57 +00:00Commented Jun 29, 2020 at 21:20
-
This is the best solution I've found! I've been searching for hours for a good way to do this. All of the other ways either didn't work at all or were really delayed. This solution starts the program as soon as the desktop loads. Thanks!Randy– Randy2020年09月25日 16:33:45 +00:00Commented Sep 25, 2020 at 16:33
-
That's great, Glad to be able to help :)Amr Sohil– Amr Sohil2020年09月26日 17:21:08 +00:00Commented Sep 26, 2020 at 17:21
Method 1:
To launch a command automatically on login, put the command into a file named
.bashrc
in the user directory (for example /home/pi)
.bashrc
is NOT intended to run scripts.It is run each time a non-login interactive shell is started and is used to configure the shell.
~/.bashrc: executed by bash(1) for non-login shells
.
For example, the file could contain
chromium-browser --kiosk www.google.com
to launch Chromium in full-screen pointed to www.google.com
Method 2:
This solution works really well. Once the browser loads there is a small black square in the top left of the screen which seems to be a general bug (its mentioned on forums by others) but otherwise the fullscreen mode hides everything except the browser page.
Edit the autostart file:
sudo nano /etc/xdg/lxsession/LXDE/autostart
Comment out everything using a '#' at the start of each line and then add the following lines
Auto run the browser
@xset s off
@xset -dpms
@xset s noblank
@midori -e Fullscreen -a http://google.com
If necessary use the configuration tool to enable auto running of the GUI on powerup
sudo raspi-config
If you need to exit back to the command prompt CTRL + ALT + F1
CTRL + ALT + F2
You could place your script at the bottom of /etc/profile
file.
Other options did not work for me, but this is maybe because I placed my script on the desktop.
make a .sh file with the commands 'python /path/to/your/script.py' type 'sudo nano /etc/rc.local' and type the path to the .sh file
before
exit 0
Or you could just type in
crontab -e
or
sudo crontab -e
if you want the script to run at startup
inside the file type in
@reboot python /path/to/your/script.py &
-
2The use of full paths is strongly encouraged for crontab entries!2016年09月06日 14:23:37 +00:00Commented Sep 6, 2016 at 14:23
it WORKS. (On every re-boot it prepare the following submissions automatic)
$ cat /etc/rc.local
#!/bin/sh -e
echo "18" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio18/direction
echo "1" > /sys/class/gpio/gpio18/value
exit 0
This is what I generally do.
- Store your file in the raspberry pi home directory. Eg: mycode.py
Edit the file:
sudo nano .bashrc
.bashrc
is NOT intended to run scripts.It is run each time a non-login interactive shell is started and is used to configure the shell.
~/.bashrc: executed by bash(1) for non-login shells
.
Go to the end of the file and write:
sudo python mycode.py
If you want the output to be stored in a txt file, edit the code in Step 3 as follows:
sudo python mycode.py >> output.py
Hope this helps!
.xinitrc
or.xsession
file.