72

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
52

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
  • 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
  • 3
    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
53

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

    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 restart your system.
  • 6
    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
27

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).

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 :)

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

protected by Community Jul 16 '14 at 16:43

Thank you for your interest in this question. Because it has attracted low-quality or spam answers that had to be removed, posting an answer now requires 10 reputation on this site (the association bonus does not count).

Would you like to answer one of these unanswered questions instead?

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