2010年9月26日日曜日

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っていうのも書けたりするらしい

0 件のコメント: