C言語でprefork型のデーモンを書く(4): init スクリプト

prefork して、シャットダウン可能なデーモン本体ができたので、次はinit スクリプトを用意する。
適当なサンプルは、/etc/init.d/ 以下にたくさんあるのでそれを参考に書いてみた。
デーモン起動時に /var/run/my_prefork_daemon.pid が自動作成されるのを利用して、起動中かどうかを判断し重複起動の防止を行い、シャットダウン時には .pid ファイルを削除している。

以下のスクリプトを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