init.d/とか各ランレベルごとの起動スクリプトについて

前回rep2の話でスタートアップとシャットダウン時に行うスクリプトについて書いた
今回は/etc/init.d/rcを使わずにやる(正式な?)方法で起動時、終了時のスクリプトを実行してみる

まず、Linuxは/etc/inittabの定義に従って、/etc/init.d/rcをランレベルを引数にして実行する。
その後、/etc/rc$runlevel.dの中にあるディレクトリを順番に実行する。$runlevelは0~6の数値
(たとえばrc1.d,rc2.d,rc3.d,rc4.d,rc5.d,rc6.d)
/etc/init.d/rcの中を読めば分かるが、大まかな挙動は以下の通り。

1.現在のランレベルと前回のランレベルを取得する。
2.現在のランレベルに対応するディレクトリのKで始まるスクリプトを探し、前回のランレベルで実行されているなら(頭文字がSで始まるスクリプトが存在しているのなら)それを止める。
3.次に、Sで始まるディレクトリを探し、前回のランレベルで起動していないと判明したらstart、もしくはstopをかける。

ちなみに0,6はstopを引数にしてSから始まるスクリプトを順次実行する。
実行する順番はSもしくはKから始まる次の2桁の数値の若い順。
SとKではKが最初に実行される。

前回のスクリプトをこの方法で実現するなら
下記のようなスクリプトを用意すればOK
init.d/my_script
rc0.d/K01my_script@
rc2.d/S99my_script@
rc6.d/K01my_script@

my_scriptの中身は↓
#! /bin/sh
### BEGIN INIT INFO
#
# Default-Start: 2
# Default-Stop: 0 6
# Short-Description: rep2
### END INIT INFO
#

PATH=/bin:/usr/bin:/sbin:/usr/sbin

case "$1" in
start)
# rep2 HDD -> memory
mkdir /dev/shm/rep2mem
rsync -av --delete /var/www/rep2mem_bk/ /dev/shm/rep2mem/
;;
restart|force-reload)
# nothing to do
:
;;
stop)
#rep2 memory -> HDD
rsync -av --delete /dev/shm/rep2mem/ /var/www/rep2mem_bk/
;;
*)
echo "Usage: /etc/init.d/my_script {start|stop}"
exit 2
;;
esac

exit 0
参考リンク
http://d.hatena.ne.jp/Naruhodius/20100923/1285247505
http://www.fulldigit.net/content/view/91/17/
cronで@rebootっていうのも書けたりするらしい