How to run scripts on start up?

1,392,078

Solution 1

Depending on what sort of scripts you need to run.. For services and the like you should use upstart. But for a user script these should be launched as session scripts by gnome! Have a look under System > Preferences > Startup Applications.

On a side note if you need some scripts to be run on terminal login you can add them to the .bash_login file in your home directory.

For 14.04 and older

A simple command (one which doesn't need to remain running) could use an Upstart job like:

start on startup
task
exec /path/to/command

Save this in a .conf file in /etc/init (if you need it to run as root when the system boots up), or in ~/.config/upstart (if you need it to run as your user when you log in).

Solution 2

One approach is to add an @reboot cron task:

  1. Running crontab -e will allow you to edit your cron.
  2. Adding a line like this to it:

    @reboot /path/to/script
    

    will execute that script once your computer boots up.

Solution 3

You can add commands to /etc/rc.local:

sudo nano /etc/rc.local

This executes the commands as root.

To execute commands as a specific user, use sudo -i -u (-i to also run the login shell). For example, to establish a persistent SSH tunnel, where myhost is definde in johndoes ~/.ssh/config file:

sudo -i -u johndoe autossh -nNT -L 1234:localhost:1234 myhost

Note that if /etc/rc.local did not exist (as is the case on Ubuntu since 16.04), you need to add a shebang line at the top (e.g. #!/bin/bash), and ensure the file is executable:

sudo chmod a+x /etc/rc.local

Solution 4

For 15.04 and later:

To run a (short-lived)1 command at startup using systemd, you can use a systemd unit of type OneShot. For example, create /etc/systemd/system/foo.service containing:

[Unit]
Description=Job that runs your user script

[Service]
ExecStart=/some/command
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Then run:

sudo systemctl daemon-reload
sudo systemctl enable foo.service

Essentially, this is just converting a typical Upstart job to a systemd one (see Systemd for Upstart users).

You can run multiple commands from the same service file, using multiple ExecStart lines:

[Service]
ExecStart=/some/command
ExecStart=/another/command some args
ExecStart=-/a/third/command ignore failure

The command must always be given with the full path. If any command fails, the rest aren't run. A - before the path tells systemd to ignore a non-zero exit status (instead of considering it a failure).

Relevant:


For user sessions, you can create the systemd unit in ~/.config/systemd instead. This should work with 16.04 onwards, but not earlier releases of Ubuntu with systemd (since those still used Upstart for user sessions). User session units can be controlled with the same commands as with system services, but with the --user option added:

systemctl --user daemon-reload
systemctl --user status foo.service

Shell syntax

Note that, unlike Upstart, systemd doesn't run the Exec* commands through a shell. It performs some limited variable expansion and multiple command (separated by ;) itself, but that's about it as far as shell-like syntax goes. For anything more complicated, say redirection or pipes, wrap your command in sh -c '...' or bash -c '...'.


1As opposed to long-lived daemons.

Solution 5

There are different ways to automatically run commands:

  1. The upstart system will execute all scripts from which it finds a configuration in directory /etc/init. These scripts will run during system startup (or in response to certain events, e.g., a shutdown request) and so are the place to run commands that do not interact with the user; all servers are started using this mechanism.

    You can find a readable introduction to at: http://upstart.ubuntu.com/getting-started.html the man pages man 5 init and man 8 init give you the full details.

  2. A shell script named .gnomerc in your home directory is automatically sourced each time you log in to a GNOME session. You can put arbitrary commands in there; environment variables that you set in this script will be seen by any program that you run in your session.

    Note that the session does not start until the .gnomerc script is finished; therefore, if you want to autostart some long-running program, you need to append & to the program invocation, in order to detach it from the running shell.

  3. The menu option System -> Preferences -> Startup Applications allows you to define what applications should be started when your graphical session starts (Ubuntu predefines quite some), and add or remove them to your taste. This has almost the same purpose and scope of the .gnomerc script, except you don't need to know sh syntax (but neither can you use any sh programming construct).

Share:
1,392,078

Related videos on Youtube

myusuf3
Author by

myusuf3

https://mahdiyusuf.com

Updated on September 17, 2022

Comments

  • myusuf3
    myusuf3 over 1 year

    How can I run scripts automatically when Ubuntu starts up so I don't have to run them manually after startup?

    • David Stocking
      David Stocking over 13 years
      If someone could also show both WHEN and WHERE that would be awesome. I say this because I know there are at least 2 ways to start a script that will fire before other applications have been started (like X11)
    • Gabriel Fair
      Gabriel Fair about 6 years
      This entire answer thread is a mess. The Stack Exchange format doesn't seem to be best suited for this question
    • Malik A. Rumi
      Malik A. Rumi almost 4 years
      +1 to @GabrielFair. A LARGE part of the problem is that the original question and answer are TEN YEARS OLD. I'd also add that there are too many ways to solve this problem. What happened to the simplicity of the Unix philosophy?! Request someone knowledgeable and with sufficient points rewrite this post, or add a new, up-to-date, definitive answer for modern os versions.
  • yood
    yood over 13 years
    The @reboot keyword is a nice tip because it is not widely known.
  • Oli
    Oli about 13 years
    Nice. Any idea exactly when this triggers?
  • Mike Wills
    Mike Wills almost 12 years
    So... this wouldn't run if I lost power and the PC turned again when power is restored?
  • That Brazilian Guy
    That Brazilian Guy over 11 years
    3) "This has almost the same purpose and scope of the .gnomerc script", except .gnomerc apparently runs before loading Unity, and Startup Applications apparently runs after loading Unity. I had to run a program that sits on Unity's menu bar and it made a huge difference in this case!
  • Riccardo Murri
    Riccardo Murri over 11 years
    @ruda.almeida Thanks for pointing that out. The answer was written in the pre-Unity days.
  • Ehtesh Choudhury
    Ehtesh Choudhury about 11 years
    Considering how SO and StackExchange runs, could you give an example of an upstart script and where it would be placed? That would make this a much better answer. Your link says it's not being maintained and to look at the upstart cookbook, which is huuuge. I don't have too much of an idea where to start.
  • jfs
    jfs about 11 years
    @siamii: man 5 crontab says that @reboot is executed on startup (when cron daemon is started).
  • Dogweather
    Dogweather over 10 years
    This most directly answers the question: how to simply execute some scripts when your system boots. upstart does a more complex task: starts daemon processes.
  • Karthik T
    Karthik T over 10 years
    This is awesome. So far this seems better than rc.local since the system seems more setup by this point (PATH, etc). It is odd that it is so hard to call something after system startup..
  • Fabrizio Regini
    Fabrizio Regini over 10 years
    I tried this for a non-root user and it did not seem to work. I had to move this into an /etc/cron.d script.
  • amphibient
    amphibient almost 10 years
    this did not work for me in Ubuntu 10.04.4 LTS
  • ceejayoz
    ceejayoz almost 10 years
    @amphibient Chances are you configured something wrong. @reboot is documented here: help.ubuntu.com/community/CronHowto
  • amphibient
    amphibient almost 10 years
    i did sudo crontab -e and then added @reboot /my/script to it. when i just run /my/script, it works fine
  • ceejayoz
    ceejayoz almost 10 years
    @amphibient It may be something in /my/script itself. Scripts run from cron may not have the same $PATH for example. If you try @reboot touch /tmp/something I'll bet that works fine.
  • amphibient
    amphibient almost 10 years
    you are right, that worked. my script says ifconfig > /some/shared_vm/dir. this is on a VM. i am trying to fetch the IP address of the VM when the system starts and print it to a file in a directory shared with the host. i think the problem is that when the VM first starts, this directory is not mounted yet, that's why. so i need to run the script maybe 5 sec after the system starts. any idea how to do that?
  • FrEaKmAn
    FrEaKmAn over 9 years
    @reboot works. I had a problem when I ran my script in terminal it worked, but not with cron. So I added >> /var/log/mylog.log 2>&1 in crontab to see the log. After restart I noticed it was missing JAVA_HOME (my script was calling some java jars).
  • John John Pichler
    John John Pichler about 9 years
    Do I need to put the path of my script or it also needs the sh before the path?
  • dopatraman
    dopatraman almost 9 years
    What if i need to run the command as root?
  • AStopher
    AStopher over 8 years
    @dopatraman The answer states that all processes with this are run as root.
  • Ashhar Hasan
    Ashhar Hasan over 8 years
    @amphibient Maybe prepending a sleep 5 would give you the desired effect.
  • Admin
    Admin over 8 years
    Please update this answer to explain what to do on systems running systemd rather than upstart (Ubuntu 15.04+).
  • Rizwan Patel
    Rizwan Patel about 8 years
    can any please help in running below as upstart service gist.github.com/jobsamuel/6d6095d52228461f3c53
  • aloplop85
    aloplop85 almost 8 years
    In Ubuntu 14.04, if the command is a path to a script where an ifconfig is executed, it does not work. It must be placed, for instance, in .bashrc of the corresponding user.
  • phil294
    phil294 over 7 years
    This answer does not make sense to me. The applications listed in system->pref->startup applications can neither be found in /etc/init/ nor in ~/.config/upstart. So where are startup applications defined?
  • phil294
    phil294 over 7 years
    added skype and autokey there, only thing that happens at XFCE4 Login is an error message.
  • Dan Dascalescu
    Dan Dascalescu over 7 years
    sudo update-rc.d myscript.sh defaults, where /etc/init.d/myscript.sh is your script, also runs it at startup.
  • Roel
    Roel over 7 years
    this doesn't work in ubuntu 16.04
  • ceejayoz
    ceejayoz over 7 years
    @ShiftN'Tab That seems extraordinarily unlikely.
  • Roel
    Roel over 7 years
    @ceejayoz this is what i entered @reboot /path/to/script/myscript.sh
  • ceejayoz
    ceejayoz over 7 years
    @ShiftN'Tab It's still extraordinarily unlikely they removed the feature. It's far more likely you've messed something up in the script itself. Did you get any errors or output in the logs?
  • Roel
    Roel over 7 years
    @ceejayoz inside of my script is a command that disables the key of the keyboard which is Alt i wrote this code xmodmap -e 'keycode 64=' when i try to run the script manually it works perfectly fine. But not with this method.
  • Roel
    Roel over 7 years
    @ceejayoz you can take a look here in my post askubuntu.com/questions/852198/…
  • ceejayoz
    ceejayoz over 7 years
    @ShiftN'Tab That should probably go in your ~/.profile instead of a @reboot, as I suspect it affects just your current session. Cron's session isn't the same as your own session. I see someone noted it's deprecated, too.
  • Roel
    Roel over 7 years
    @ceejayoz yes but those link doesnt have a sound solution to my problem. Hope you could help
  • r3wt
    r3wt about 7 years
    is it possible to set a priority on the job? or specify that it depends on another service to be started first?
  • ken
    ken almost 7 years
    Should it? This no longer works these days, right?
  • alhelal
    alhelal almost 7 years
    I want to run wget -r http://tug.org/ on startup after network connection established. How can I do this?
  • fosslinux
    fosslinux almost 7 years
    And what about 15.04 and later?
  • ceejayoz
    ceejayoz almost 7 years
    @ubashu What about 15.04? Ubuntu didn't get rid of cron.
  • user1709076
    user1709076 almost 7 years
    according to askubuntu.com/questions/735935/… crontab @reboot does not do anything after a system shut-down, or cold boot.
  • user1709076
    user1709076 almost 7 years
    However for anyone who's interested, I found that on AWS EC2, when I 'stop' the EC2 instance and start the EC2 instance again, that doing crontab reboot /home/ubuntu/mountefs.sh method works for mounting EFS - so the reboot method appears to work for 'restart', and 'stop' and 'start', so I would expect this method to work for any disaster recovery scenario?
  • mafrax
    mafrax over 6 years
    Doenst work with Ubuntu 17.04 systemd
  • psitae
    psitae over 6 years
    Note that if you make this file yourself (like I did), then you will have to change file to executable with chmod 755 rc.local, and add #!/bin/bash to the first line.
  • Psddp
    Psddp over 6 years
    Does the system wait for the script to finish before continuing the booting process?
  • Mars
    Mars over 6 years
    Still a good answer 7 years later.
  • muru
    muru over 6 years
    There are many different ways to add cronjobs, but the core of the highly voted answer and your answer is still the @reboot.
  • muru
    muru over 6 years
    Alternate methods for adding crontabs should be posted to askubuntu.com/q/2368/158442, which is explicitly about adding Cron jobs.
  • WinEunuuchs2Unix
    WinEunuuchs2Unix over 6 years
    I beg to differ. The core of the answer in question utilizes crontab -e which some consider one of the black arts due to a vim-like interface. On the other hand this answer might appeal to those whose brains are wired a certain way. We are not all cast from the same mold. Then again this answer already has one down vote so we'll let democracy take her course.
  • muru
    muru over 6 years
    Oh, please. You and I both know that the editor can be changed.
  • muru
    muru over 6 years
    @r3wt yes, there are different ways to do that. The WantedBy used here, for example, makes it start when the multi-user.target is reached. You can use Before, After, Requires, etc. See man systemd.unit
  • WinEunuuchs2Unix
    WinEunuuchs2Unix over 6 years
    @muru Yes probably because you taught me and I learned to change editor to something like nano or a couple of other CLI's. But I'm in the gedit camp. Besides crontab -e brings up memories of asterisks ("*") for minutes, hours, etc. that I've always found I need to google instructions for. I still find using /etc/cron.d and /etc/cron.daily my go to choice. Especially since it mirrors /etc/udev/rules.d and /etc/systemd/system-sleep methods. It just seems like a nice fit.
  • muru
    muru about 6 years
    @PerlDuck not the only thing it was lacking. Thanks!
  • PerlDuck
    PerlDuck about 6 years
    You're welcome. — Btw, the RemainAfterExit depends on the service you start and its desired behaviour. For instance, /bin/df -h <s>would</s> should have RemainAfterExit=no.
  • muru
    muru about 6 years
    @PerlDuck There's nothing inherent in df that needs RemainAfterExit=no. Unless you want to repeatedly execute the command each time you run systemctl start foo.
  • PerlDuck
    PerlDuck about 6 years
    The difference comes when you issue systemctl status foo: with RemainAfterExit=yes it says active while with RemainAfterExit=no it doesn't. However.
  • muru
    muru about 6 years
    @PerlDuck that's a cosmetic change compared to the difference when starting the service multiple times.
  • Juan Calero
    Juan Calero almost 6 years
    @EhteshChoudhury I found here a nice introduction to upstart: digitalocean.com/community/tutorials/…
  • ni8mr
    ni8mr over 5 years
    This has worked for me (Ubuntu 16.04). I have a question though. How can i see the errors (if any) generated after running the script? (I have run a Django app after everytime i have started the Desktop)
  • João Pimentel Ferreira
    João Pimentel Ferreira almost 5 years
    Does it mean that sudo ls /etc/systemd/system/*.service lists all the services that run on startup?
  • Stalinko
    Stalinko over 4 years
    Tried to add a path to bash script, tried to write the command itself - nothing worked. Tried to redirect whole output into a file - it's created but empty. Ubuntu 18.04 :((
  • MERose
    MERose over 4 years
    Doesn't work on Ubuntu 18.04. $HOME/.config/autostart contains but one file for dropbox, which BTW isn't executable.
  • stenci
    stenci about 4 years
    upstart is deprecated (not supported, last release in 2014)
  • Father Stack
    Father Stack about 4 years
    Worked for me on Ubuntu 18.04.1. Btw. I added the desktop entry via Search -> Startup applications. The outcome is exactly the same though.
  • apkg
    apkg about 4 years
    This is much clearer than the highly voted answer. Every answer has hundreds of comments saying "doesn't work", because this task is more subtle than the original post suggests.
  • goonerify
    goonerify almost 4 years
    This should be the accepted answer
  • reducing activity
    reducing activity over 3 years
    this did not work for me in Ubuntu 20.04.4 LTS
  • opinion_no9
    opinion_no9 over 3 years
    great! Thank you @paolo-granada-lim ! You solved my problem in old Ubuntu16.x: Using a LUKS with the usual /dev/mapper method led to noexec of this (home) partition. Did not care for "exec" in fstab (!), did not care for rwx of directories or so; SOLUTION: Just put "sudo mount -o remount,exec /home " in the /etc/rc.local (which already had an shebang). Now my encrypted mount works fine with exec permission thanks to the automatic remount. 10 years after .... THX !
  • GabrieleMartini
    GabrieleMartini almost 3 years
    public support ending April 2021
  • Andyc
    Andyc over 2 years
    I followed your suggestion to read man 5 systemd.service and I got even more confused. Say I want to mount an sshfs filesystem at boot as user instead of root, so I can't do it with fstab. However. I obviously need to make sure the network is up when the service starts. How would I do that? And is a Oneshot still the right way or should it be "long lived"?
  • muru
    muru over 2 years
    @Andyc in the case of sshfs, stackoverflow.com/a/19972859/2072269 or askubuntu.com/a/1117790/158442 in /etc/fstab to mount. (The relevant parts from my own /etc/fstab include _netdev,users,IdentityFile=/home/muru/.ssh/id_rsa,idmap=user‌​,allow_other,default‌​_permissions,uid=100‌​0,gid=1000. Works fine enough.) If I did have to use systemd to mount something, I'd use systemd.mount instead.
  • Andyc
    Andyc over 2 years
    @muru I can't believe it. I spent all day yesterday trying to make the sshfs in fstab work, including the configurations from the answers you linked and a million aothers, to no avail. I couldn't ssh into the remote machine with sudo, which made me try the systemd route. Today I come here, I try to sudo ssh into the remote machine, and it works fine. I have no clue how that happened. Maybe the computer itself needed a rest (although I didn't turn it off, I left it on all night).
  • Aaron Silverman
    Aaron Silverman over 2 years
    Note you can specify the user and group to run the script as with User=xxxx and Group=xxxx under the Service header.
  • Alexander Beatson
    Alexander Beatson over 2 years
    Sadly, this does not work for me in 20.04.2. I feel really bad to downvote this because this answer is not for everyone.
  • ceejayoz
    ceejayoz over 2 years
    @AlexanderBeatson No need to feel bad. I've gotten well more rep from this answer than it deserves, and subsequent answers are likely better here in 2021.
  • Admin
    Admin almost 2 years
    Its not possible Service has more than one ExecStart= setting, which is only allowed for Type=oneshot services. Refusing.