| Linuxの起動と起動スクリプト |
ここでは、Linuxの起動と起動スクリプトについて説明する。 RedHat Linuxで起動時に立ち上げるdemonは/etc/rc.d/init.d/ の中に入っているものから選ばれる。 なので、起動スクリプトは このあたりのファイルを参照して作ってやればよい。 今回は、DynamicDNSサービスでIPのアップデート自動で行って くれるデーモンであるez-ipupdateをモデルにして説明して行く。
| 起動とRUNレベル |
Linuxの起動は以下の手順をふんで起動される。
と行った感じなる。/etc/inittabの中に、Runレベルの説明が書いてある。
# Default runlevel. The runlevels used by RHS are: # 0 - halt (Do NOT set initdefault to this) # 1 - Single user mode # 2 - Multiuser, without NFS (The same as 3, if you do not have networking) # 3 - Full multiuser mode # 4 - unused # 5 - X11 # 6 - reboot (Do NOT set initdefault to this) |
0はシステムを落すときに使うものである。
1は、シングルユーザモードである。
2はNFSマウントなしのマルチユーザモード、
3がフルサポートのマルチユーザモードで、
5がXからの立ち上げとなる。
6は、再起動時に用いられる。
通常の立ち上げ時には、3か、5のどちらかになっているはず。
これに従って作られているのが、/etc/rc.d/rc$runlevel.d ディレクトリである。 /etc/rc.d/rcというスクリプトが、対応するrunlevelのディレクトリ中の 起動スクリプトを実行する。
/etc/rc.d/rc$runlevel.dの中には、
KではじまるものとSではじまるものが入っている。
Kではじまるものが止めるプロセスで、引数stopをつけて
実行される。
Sではじまるものがスタートさせるプロセスで、
引数startを付けて実行される。
| 起動スクリプトをつくる。 |
/etc/rc.d/init.dの下に起動スクリプトをつくる。 他の起動スクリプトを参照して作ったのが以下のスクリプトである。
#!/bin/bash
#
# Version: 0.1
#
# chkconfig: 345 99 01
# description: Runs the autoupdate daemon that update DynamicDNS IP address
# processname: /usr/local/bin/ez-ipupdate
# config: /etc/ipupdate.conf
# We require the /etc/delegeted.conf file, but supply it in the package, so it
# should always be there.
progname=ez-ipupdate
lockfile=/var/lock/subsys/ipupdate
prog=/usr/local/bin/ez-ipupdate
conffile=/etc/ipupdate.conf
[ -f $conffile ] || exit $?
# Source function library.
. /etc/init.d/functions
RETVAL=0
start() {
echo -n $"Starting $progname: "
daemon $prog -c $conffile
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch $lockfile
return $RETVAL
}
stop() {
echo -n $"Stopping $progname: "
killproc $prog
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f $lockfile
return $RETVAL
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status $prog
RETVAL=$?
;;
restart)
stop
start
;;
condrestart)
if [ -f $lockfile ]; then
stop
start
fi
;;
reload)
action $"Reloading $progname:" killall -HUP $prog
;;
*)
echo $"Usage: $0 {start|stop|restart|reload|condrestart|status}"
exit 1
esac
exit $RETVAL |
上から順番に説明して行くと、
# chkconfig: 345 99 01 |
chkconfigやlinuxconfで自動でいろいろ見てもらうための設定。
最初の数字がデフォルトのRUNレベルの設定でRUNレベル3,4,5の
がデフォルトになる事を示す。
2番目の数字がstart時のpriorityで99までの数字でしめす。
(100以上の数字も使えるのか試したことはない。)
3番目の数字がstop時のpriorityで00からの数字で示す。
100からstartの数字を引いて書いておけば、スタート時と
逆の順番でstopされていく事になる。
# description: Runs the autoupdate daemon that autoupdate DynamicDNS's IP address # processname: /usr/loca/bin/ez-ipupdate # config: /etc/ipupdate.conf |
linuxconfに情報を伝えるもの。config:で示されたファイルが 更新されたら、linuxconfは、このプロセスを再起動しようとする。
progname=ez-ipupdate lockfile=/var/lock/subsys/ipupdate prog=/usr/local/bin/ez-ipupdate conffile=/etc/ipupdate.conf |
ファイルの名前や、conifgファイルの名前をlockファイルの名前を 定義する。
# Source function library. . /etc/init.d/functions |
用意してあるfunctionライブラリ(daemon,killproc,status等)を includeする。
daemon $prog -c $conffile |
$progを -c $conffileの引数で起動する。
daemonファンクションは、後ろにそのまま、起動したいプロセス
と引数を書けばよい。
このあたりを設定すれば、ほとんど動くでしょう。
| linuxconfやchkconfigで起動を有効にする。 |
linuxconfやchkconfigで以上の設定を確認できる。 また、どのレベルで立ち上げるかを決めることができる。
まずは、chkconfig --listでちゃんと入っているかどうか 確認してみる。
# chkconfig --list ipupdate ipupdate 0:off 1:off 2:off 3:off 4:off 5:off 6:off
自分のいれた起動スクリプトの名前がちゃんと表示されればOKである。
chkconfigでスタート時に起動するようにいれるためには、
--addオプションを使えばよい。
起動しないようにするには、--delを使えばいい。
# chkconfig --add ipupdate # chkconfig --list ipupdate ipupdate 0:off 1:off 2:off 3:on 4:on 5:on 6:off # chkconfig --del ipupdate # chkconfig --list ipupdate ipupdate 0:off 1:off 2:off 3:off 4:off 5:off 6:off
linuxconfでも起動の設定をすることができる。
Control->Control panel->Control service activity
を選択する。
そこに自分の追加した項目(ipupdate)があるはずである。それを選択する。
それを選択すると、立ち上げなどの設定ができる。
Descriptionは起動スクリプトのdescription:の項目に書いてあるものが 表示される。
両方のツールが無い人は、 /etc/rc.d/rc$runlevel.d/の下にあるlinkにしたがって自分も 同じようにlinkを張っておけばよい。
# cd /etc/rc.d/rc3.d/ # ln -s ../init.d/ipupdate S98ipupdate # cd /etc/rc.d/rc4.d/ # ln -s ../init.d/ipupdate S98ipupdate # cd /etc/rc.d/rc5.d/ # ln -s ../init.d/ipupdate S98ipupdate # cd /etc/rc.d/rc0.d/ # ln -s ../init.d/ipupdate K01ipupdate # cd /etc/rc.d/rc6.d/ # ln -s ../init.d/ipupdate K01ipupdate
自分の好きなrunlevelに登録しておけば、 起動時にスタートアップしたり、シャットダウン時に ストップすることができる。