How to execute a shell script on startup?

Solution 1:

/etc/init.d is the script directory, in which the executable scripts appear. However, in order to run scripts in a particular order after your system starts, you need to add files to the /etc/rc#.d directory. Entries that appear here tell your system in what order and at what run level scripts in /etc/init.d should be run. The number after the rc indicates what run level the machine is running at, according to this chart:

http://en.wikipedia.org/wiki/Runlevel

So if you have:

/etc/init.d/importantscript

Then you need the (empty) files:

/etc/rc.d/rc3.d/S20importantscript
/etc/rc.d/rc6.d/K20importantscript

The S means start, and the K means kill. When your machine starts, the system will say "Ah, I'm running at RunLevel 3, let's pop over to rc3.d to see what scripts in '/etc/init.d' need to be run and in what order." In this case, the system will sort by 'S' and then the number after 'S' and will execute '/etc/init.d/importantscript start'. The 20 is just for ordering purposes... your script will run behind 'S19' and in front of 'S21'. You can create these files simply by doing:

sudo touch /etc/rc.d/rc3.d/S20importantscript

Here's a nice summary as well: http://www.linux.com/news/enterprise/systems-management/8116-an-introduction-to-services-runlevels-and-rcd-scripts

Solution 2:

You don't have to --- and shouldn't --- create files in /etc/rc.d/rcN.d/; what you should do instead is put a comment in your init script reading

# chkconfig NNN A B

where NNN is the set of run-levels in which you want the script active (e.g., 345 if it's active in runlevels 3, 4, and 5), and A and B are the start and stop priorities. Then chkconfig --add foo (assuming your script is named foo) will create the files in /etc/rc.d/rcN.d/ with the appropriate names.

You can then use service foo bar to send the bar message to your script (e.g., start, stop, whatever -- that's where your $1 comes from).