Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

I have created a script to start a server (my first question). Now I want it to run on the system boot and start the defined server. What should I do to get this done?

My findings tell me put this file in the /etc/init.d location, and it will execute when the system will boot. But I am not able to understand how the first argument on the startup will be start? Is this predefined somewhere to use start as $1? If I want to have a case startall that will start all the servers in the script, then what are the options I can manage?

My script is like this:

#!/bin/bash

case "$1" in
start)
     start
    ;;
stop)
    stop
    ;;

restart)
    $0 stop
    $0 start
    ;;
*)
    echo "usage: $0 (start|stop|restart)"
;;
esac
share|improve this question
    
I know this is old... but the shell should be '#!/bin/sh' not '#!/bin/bash' /bin/sh is more likely to work in the case of a machine that has issues during startup (e.g. /usr/lib not being able to be mounted) –  Rich Homolka Feb 8 '13 at 23:04
add comment

3 Answers

up vote 11 down vote accepted

/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

share|improve this answer
add comment

The $1 is the command line argument that is passed to your script, it is one of start, stop or restart. In openSUSE, I don't remember having an option to pass other arguments into the script when useing the runlevel editor thingy, so I think that these are probably the only ones you should use.

I don't use CentOS myself, but it seems that the program to control what is started at which runlevel is ntsysv.

share|improve this answer
add comment

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

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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