よくある話ですが、せっかくなのでInitスクリプトから作ってみました。
まずは対象のプログラムですが、下記のようにバックグラウンドで
スリープするだけのものを用意しました。
/tmp/sleep.sh
#!/bin/sh sleep 60 & echo $! > $1
バックグラウンドで60秒スリープするプロセスのIDをファイルに記録するシェルスクリプト.sh
スクリプト内でプロセスID($!)を書き出しているところがポイントです。
次に上記のプログラムを起動するInitスクリプトです。
下記のように、それっぽく用意しました。
プログラム起動時にPIDファイルを引数として渡しています。
/etc/init.d/sleep
#!/bin/sh # # chkconfig: - 99 01 . /etc/rc.d/init.d/functions BASE=`basename $0` PIDFILE="/var/run/${BASE}.pid" LOCKFILE="/var/lock/subsys/${BASE}" PROGRAM="/tmp/sleep.sh ${PIDFILE}" rh_start() { echo -n "Starting ${BASE}:" daemon --check ${BASE} --pidfile ${PIDFILE} ${PROGRAM} RETVAL=$? echo [ ${RETVAL} -eq 0 ] && touch ${LOCKFILE} return ${RETVAL} } rh_stop() { echo -n "Stopping ${BASE}:" killproc -p ${PIDFILE} ${BASE} RETVAL=$? echo [ ${RETVAL} -eq 0 ] && rm -f ${LOCKFILE} return ${RETVAL} } rh_status() { status -p ${PIDFILE} -l ${LOCKFILE} ${BASE} RETVAL=$? return ${RETVAL} } case "$1" in start|stop|status) rh_$1 ;; restart) rh_stop rh_start ;; *) echo $"Usage: ${BASE} {start|stop|restart|status}" exit 2 esac exit $? Initスクリプトのテンプレート.sh
次の仕様に準じるところまでは作りこんでいません…
Linux Standard Base Core Specification, Generic Part
Chapter 22. System Initialization
22.2. Init Script Actions
最後にMonitの設定ファイルです。上述のPIDファイルを指定しています。
/etc/monit.d/sleep
check process sleep with pidfile /var/run/sleep.pid start program "/etc/init.d/sleep start" with timeout 60 seconds stop program "/etc/init.d/sleep stop" if 5 restarts within 5 cycles then unmonitor Monitでプロセスを自動復旧させる設定.txt
準備ができたらMonitを再起動します。
# service monit restart Shutting down monit: [ OK ] Starting monit: [ OK ]
スリープのプロセスは、当然、指定の時間がくると終了するので、
下記のようにログから、Monitがそれを検知して起動していることがわかります。
# tail -f /var/log/monit ... [JST Jun 28 16:27:48] error : 'sleep' process is not running [JST Jun 28 16:27:48] info : 'sleep' trying to restart [JST Jun 28 16:27:48] info : 'sleep' start: /etc/init.d/sleep [JST Jun 28 16:28:49] info : 'sleep' process is running with pid