share facebook facebook2 twitter menu hatena pocket slack

2015.07.10 FRI

Monitでプロセスを自動復旧させる

鈴木 宏康

WRITTEN BY鈴木 宏康

よくある話ですが、せっかくなので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 

元記事はこちら

Monitでプロセスを自動復旧させる

鈴木 宏康

鈴木 宏康

愛知県生まれ。東京工業大学大学院修士課程修了。在学時より、ベンチャー企業でインターネットに関する業務に携わり、現在はクラウド(主にAmazon Web Services)上での開発・運用を軸とした事業の、業務の中心として活躍。