13

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
  • 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
19

/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

  • isn't it more common to "ln -s /etc/init.d/script" to rcX.d/* ? – ozma Jul 25 '17 at 8:20
8

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

0

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.

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.