C言語でprefork型のデーモンを書く(4): init スクリプト
prefork して、シャットダウン可能なデーモン本体ができたので、次はinit スクリプトを用意する。
適当なサンプルは、/etc/init.d/ 以下にたくさんあるのでそれを参考に書いてみた。
デーモン起動時に /var/run/my_prefork_daemon.pid が自動作成されるのを利用して、起動中かどうかを判断し重複起動の防止を行い、シャットダウン時には .pid ファイルを削除している。
- initスクリプト作成
以下のスクリプトをchmod 755して、/etc/init.d/my_prefork_daemon として保存する。 Cで書いた my_prefork_daemon 本体へのパスは要変更。
75,25 という数字は、起動、停止 順序を決める数字(75が起動、25が停止)。前提となるサービスがある場合には、そのサービスの後に起動され、そのサービスの前に停止するように、数字を大きく/小さくする必要がある。
#! /bin/bash # # my_prefork_daemon # # chkconfig: 2345 75 25 # description: foo bar # # Source function library. . /etc/rc.d/init.d/functions prog="my_prefork_daemon" RETVAL=0 start() { echo -n $"Starting $prog: " if [ -e /var/run/$prog.pid ]; then failure echo echo "cannot start $prog: $prog is already running."; return 1 fi daemon /PATH/TO/YOUR/$prog && success RETVAL=$? echo return $RETVAL } stop() { echo -n $"Stopping $prog: " if [ ! -e /var/run/$prog.pid ]; then failure echo echo $"cannot stop $prog: $prog is not running." return 1; fi kill `cat /var/run/$prog.pid` && success RETVAL=$? echo [ $RETVAL -eq 0 ] && rm -f /var/run/$prog.pid return $RETVAL } restart() { stop start } case "$1" in start) start ;; stop) stop ;; restart) restart ;; status) if [ -f /var/run/$prog.pid ]; then echo $"$prog is running." RETVAL=0 else echo $"$prog is not running." RETVAL=3 fi ;; *) echo $"Usage: $0 {start|stop|restart|status}" exit 1 esac exit 0
- chkconfig
init スクリプトができたら、chkconfig で自動起動の設定。
サービスに追加 # chkconfig --add my_prefork_daemon 自動起動の設定 # chkconfig my_prefork_daemon on サービス一覧表示 # chkconfig --list 〜前略〜 crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off my_prefork_daemon 0:off 1:off 2:on 3:on 4:on 5:on 6:off network 0:off 1:off 2:on 3:on 4:on 5:on 6:off postfix 0:off 1:off 2:on 3:on 4:on 5:on 6:off sshd 0:off 1:off 2:on 3:on 4:on 5:on 6:off 〜後略〜
- service コマンドで起動、停止のテスト
# service my_prefork_daemon start Starting my_prefork_daemon: [ OK ] # service my_prefork_daemon restart Stopping my_prefork_daemon: [ OK ] Starting my_prefork_daemon: [ OK ] # service my_prefork_daemon stop Stopping my_prefork_daemon: [ OK ] # service my_prefork_daemon status my_prefork_daemon is not running.
これでマシン起動時に自動で my_prefork_daemon が起動され、マシン停止時には自動でシャットダウンされる。
参考
C言語でprefork型のデーモンを書く(1): 非デーモン prefork サンプル - Sleepless geek in Seattle
C言語でprefork型のデーモンを書く(2): 非デーモン prefork シグナルハンドラ付き - Sleepless geek in Seattle
C言語でprefork型のデーモンを書く(3): デーモン化 - Sleepless geek in Seattle