I had a script that automatically enables my wifi without using networkmanager, but I don't know how to run the script as root while the system is booting. How do I make the script run automatically during boot?


Place the script you want to run in the /etc/init.d directory and make the script executable.

chmod 755 myscript

Once that is done create a symbolic link in the run level directory you would like to use, for example if you wanted to run a program in the graphical runlevel 2, the default runlevel for Ubuntu, you would place it in the /etc/rc2.d directory. You just cannot place it the directory, you must signify when it will run by indicating the startup with an “S” and the execution order is important. Place it after everything else that is in the directory by giving it a higher number.

If the last script to be run is rc.local and it is named S99rc.local then you need to add your script as S99myscript.

ln -s /etc/init.d/myscript /etc/rc3.d/S99myscript

Each backward compatible /etc/rc*.d directory has symbolic links to the /etc/init.d/ directory.

  • 2
    Note that under Ubuntu Server 14.04, I needed to use /etc/rc2.d, instead of rc3.d as indicated in the example. It seems rc2.d isn't just the graphical run level.
    – Brad
    Dec 24 '14 at 3:52
  • 1
    cd /etc/rc`cat /etc/init/rc-sysinit.conf | grep "env DEFAULT_RUNLEVEL" | grep -oP "\d"`.d will take you to which /etc/rc?.ddirectory corresponds to your default runlevel.
    – Kevin
    Sep 12 '16 at 4:04
  • 1
    Instead: " If the last script to be run is rc.local and it is named S99rc.local then you need to add your script as S99myscript. ". Did you mean: " If the last script to be run is myscript and it is named S99myscript then you need to add your script as S99myscript. " ???
    – Dor
    Oct 5 '16 at 7:55
  • 8
    Keep in mind that this won't work with systemd (i.e., starting with Ubuntu 16.04). See this instead. Nov 24 '16 at 10:31
  • There is no S*rc.local file exist
    – alper
    Jul 4 at 9:42

Use a crontab option to make your script run after reboot,

you can do it by adding @reboot code in cron

Open crontab by root user:

$ sudo crontab -e

Add the next record at the bottom:

@reboot yourScriptPath 

That will do what you want.

  • Did you mean using command crontab -e, which does not need superuser privileges? I wonder, if it can run scripts that need to be run as root.
    – jarno
    Dec 27 '15 at 12:26
  • I tested this. It does not run the script as root.
    – jarno
    Jan 11 '16 at 13:43
  • 5
    You have to add the line while running command sudo crontab -e to make it run the script as root during startup.
    – jarno
    Apr 14 '16 at 14:12
  • 3
    no need to remove /var/run/crond.reboot anymore, this sees to be fixed long ago
    – rubo77
    Oct 19 '19 at 22:33
  • 2
    This worked on Ubuntu 20, no need to remove /var/run/crond.reboot, could run sudo -i -u myuser bash -c '...', and is much simpler than creating a systemd script. Sep 12 '20 at 20:35

Include the command in /etc/rc.local. It will be run whenever the user's runlevel changes.

Note: You have to put the command before the last line in /etc/rc.local that contains: "exit 0".

  • 3
    Note: you have to put the command before the last line in /etc/rc.local that contains: exit 0
    – rubo77
    Oct 14 '14 at 20:02
  • 3
    /etc/rc.local in ubuntu 15.10 has in comment that "This script is executed at the end of each multiuser runlevel." So the script could be run several times during boot, right?
    – jarno
    Dec 27 '15 at 13:33
  • @jamo, yes, on each runlevel. I don't knwo how this is related to run "at boot", which usually mean "run once at boot".
    – m3nda
    May 22 '17 at 22:07
  • I do not have this file on debian buster Sep 16 '20 at 0:53

This worked for me on Ubuntu 17.04:

  1. create a script file like disable_cdrom in convenient for you location. In my case home/yterle/disable_cdrom. In my case:

    eject /dev/sr0 -i 1
  2. make it executable chmod 775 disable_cdrom

  3. navigate to /etc/systemd/system and create there a service file. For example sudo gedit /etc/systemd/system/disable_cdrom.service

My disable_cdrom.service looks like this:

Description=Disable cdrom

ExecStart=/bin/sh /home/yterle/disable_cdrom


Where ExecStart points to run your script with /bin/sh

Then run systemctl enable disable_cdrom.service to enable the systemd service

  • 1
    Voting this up as it's what I was looking for, but I think you mean systemctl enable disable_cdrom.service Sep 23 '18 at 17:31

Include your Script file to /etc/init.d/ with Executable permission then set different run level

$ update-rc.d script-name default

It will put your script on boot startup.

  • Does not work for me on Kali Linux v2.0. Did you mean update-rc.d script-name enable? Oct 5 '15 at 3:38
  • update-rc.d <script-name> default shell script which you have copy at /etc/init.d/<script-name>
    – M S Parmar
    Oct 5 '15 at 6:32
  • Not working for me on Ubuntu 20.10
    – Slowaways
    Mar 5 at 18:25

Create a text file like this in /etc/cron.d/:


@reboot   root    yourScriptPath

(You should replace yourScriptPath with the path to the script you want to run.)


Careful with adding the script to rc.local - I was stuck in splash screen because of it. Pressing Alt+F1 revealed what was going on behind the splash screen (the script in rc.local was running).

I could not get out of it.

  • Ctrl+Alt+Del or
  • Alt+PrtSc+K or
  • Ctrl+Alt+F#

nothing works.

I had to boot from a USB Ubuntu image, find rc.local, give myself permissions to file and delete it. I guess you shouldn't do stuff if you don't know what you're doing.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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