78

I have a script that I would like to run when my system starts. I have put it on "rc.local", but it doesn't work. How can I enable it to run on startup?

  • 1
    Where is the xsetwacom command? /etc/rc.local is executed with a very simple PATH at startup. It probably differs from the PATH you have logged in at the terminal. In the terminal, type: type -p xsetwacom then replace the "xsetwacom" command in /etc/rc.local with the full path as returned by the "type -p". Do you have to do any manual initializations before xsetwacom works for you? – waltinator Sep 28 '11 at 22:09
  • 3
    Using systemd as startup manager make sure the rc.local compatibility is running: systemctl status rc-local.service – rubo77 Apr 21 '16 at 8:09
  • waltinator's comment was my problem. Because of the minimal path, it didn't know how to run the scripts I wanted to be run. The path loaded on my Ubuntu 14.04 system at the time of runninig /etc/rc.local was the following: /sbin:/usr/sbin:/bin:/usr/bin... you could check yours by putting echo $PATH > /home/rc_local_path into your /etc/rc.local and then checking the file after it's been run on startup. – RaisinBranCrunch Dec 31 '16 at 6:44
  • Keep in mind that if your script needs to run continuously you have to start it as a daemon in the rc.local file! – totymedli Jan 30 '17 at 14:02
  • Use sudo systemctl enable rc-local.service to ensure that /etc/rc.local is executed during the server startup – William Nov 17 '17 at 10:36
64

Can you run your script manually? If not, it's a problem with that script; otherwise look more at rc.local. (If that script needs to run as root, you need use sudo to manually run it.)

Make sure /etc/rc.local is executable and that the script it calls is also executable.

$ ls -l /etc/rc.local
-rwxr-xr-x 1 root root 419 2010-08-27 11:26 /etc/rc.local

Make sure rc.local has a shebang line (which is the default):

$ head -n1 /etc/rc.local
#!/bin/sh -e
| improve this answer | |
  • Yes, I can run the script manually. How can I make sure /etc/rc.local is executable? What do I have to type? Is it "$ ls -l /etc/rc.local -rwxr-xr-x 1"? Thanks! – pedroo Oct 28 '10 at 8:47
  • @pedroo: I've copied exactly what I see in my terminal (so you see the prompt, input, and output all above). The command is "ls -l /etc/rc.local" and if it's executable, it will have those Xs in the output. – Roger Pate Oct 28 '10 at 8:50
  • 4
    I've tried the "ls -l /etc/rc.local" and it is executable, but I cannot make it run on startup... Any idea? – pedroo Oct 28 '10 at 23:49
  • 1
    @pedroo: That needs the X server running, which doesn't happen when rc.local executes. Running it from rc.local will just make it exit without doing anything (though I hope it puts a message in syslog or elsewhere). You need to put the xsetwacom commands in ~/.xinitrc or /etc/X/xinit/xinitrc instead. – Roger Pate Oct 29 '10 at 0:07
  • 1
    @pedroo: Because rc.local contains commands intended to run at a different time. Create a new file, you can put it in ~/bin, mark it executable (chmod or properties in Nautilus), make the first line "#!/bin/bash", then put your commands on later lines. – Roger Pate Oct 30 '10 at 15:10
57

In my case none of the instructions were a perfect solution. If you were as unlucky as me, try this detailed one

  1. Put all your executing code in a separate text file with an arbitrary name such as foo.sh and save it in an arbitrary place.
  2. Add

    #!/bin/sh
    

    as first line of your code.

  3. Try executing your foo.sh by

    sudo foo.sh
    

    to check there are no errors at all.

  4. Provide your /etc/rc.local script with full path and name of your created script after the sh command

    sh '/path/to/your/script/foo.sh'
    
  5. Remember to put the above line before the last line of code and

    exit 0
    

    at the end of the /etc/rc.local script.

  6. Check first line of /etc/rc.local to be

    #!/bin/sh -e
    
  7. Make your /etc/rc.local executable in case it is not already executable by

    sudo chown root /etc/rc.local
    sudo chmod 755 /etc/rc.local
    
  8. Check everything works fine by executing

    sudo /etc/init.d/rc.local start
    
  9. Test by restarting your system.
| improve this answer | |
  • 7
    Step #8 was the key, verifying that the script will run under the startup environment. In my case I need to give the full path to the command. – Peter Gluck Jul 19 '15 at 2:22
  • Prefect and step to step greats, it's works on centos but sudo /etc/rc.local start first run. – A1Gard Oct 28 '15 at 11:35
  • Thanks - this break down really helped for me and as above step #8 was the key for me too! Without that it woudn't redirect +1 (for reference, node app running on bitnami cloud server using forever for continuous running). – fidev Sep 29 '16 at 8:56
  • Step 8 was a good tip, But i think step 7 might be what fixed mine, I was trying to run the script using cron to open a tunnel but it was failing randomly – SeanClt Jun 17 '17 at 19:19
  • In 6 and 7, you write about /etc/rc.local, but in 8, it's /etc/init.d/rc.local. On my 18.04, I have neither of these, shall I create them? Are you talking about different files or is it a mistake? – Daniel Alder Feb 12 at 0:37
33

On newer Ubuntu versions systemd is used and /etc/rc.local is not loaded always by default.

Check if the Compatibility service is loaded with

systemctl status rc-local.service

screenshot

If it contains active (exited) your setting seems fine and you could have another error in your /etc/rc.local file (this could be a command that fails for example).

| improve this answer | |
3

2 suggestions.

  1. Ensure that the target script file is also marked executable.
  2. Is the target script running a sudo command? If so you might want to supply the sudo password to it.

My bad. Just check one then. Thanks for the correction enzotib :)

| improve this answer | |
  • 8
    rc.local is run as root, so no password is necessary. – enzotib Jun 29 '11 at 21:22

Not the answer you're looking for? Browse other questions tagged or ask your own question.