2009年2月10日火曜日

Ubuntuでプロセス監視ツール

 polipo がよく落ちるのでその度にsshしてpolipoを再起動とかいい加減しんどくなってきたので、プロセスを監視し、落ちていたら自動的に再起動させるツールを作ってみました。
 いわゆるデーモン監視ツールですね。ちゃんとした、daemontool とか、monit とか、鯖向けの本格的なツールはあるんですが、個人使用のPCで外向けに本格的なサーバを運用しているわけでもないので、そこまでの本格的な道具が必要なかったり、リソース食いすぎで嫌だったりするわけで自作することにしました。
 自作といっても簡単です。シェルスクリプトで while do で無限ループで走らせ、その中でプロセスが起動しているかいないかチェックし、落ちでいたら再起動させるだけです。
 基本形はこんな感じで。
while true
do
ここに処理を書く。
sleep 30
done
 sleep は30秒としていますが、お好みで。

 今回は、/etc/init.d/polipo の起動スクリプトの中に、この作ったシェルスクリプトを埋め込んで一緒に起動させることにします。polipoが起動したら監視ツールも一緒に起動し、polipoが死んだら自動的に再起動という按配ですね。

#!/bin/sh
# last updated : 2009/02/06 00:20:41 JST
# $Id: polipo_check.sh,v 1.6 2009/02/05 15:21:06 yama Exp $
# プロセス監視ツール。
# polipo が動いているかどうかをチェックし、起動していなかったら、再起動させる。
#

DEMON="polipo"

# 多重起動防止処理。
SCRIPT_PID="/var/run/polipo_check.pid"
if [ -f $SCRIPT_PID ]; then
PID=`cat $SCRIPT_PID `
if (ps -p ${PID} -o pid= >/dev/null); then
exit
fi
fi
echo $$ > $SCRIPT_PID

# 監視無限ループ処理。
while true
do
ps -C ${DEMON} -o comm= > /dev/null || /etc/init.d/${DEMON} restart
sleep 30
done

# PIDファイルの削除。
rm $SCRIPT_PID

/etc/init.d/polipo 内にスクリプトを埋め込みますので、多重に自身を起動しないように防止処理を入れています。
 後はpsコマンドで定期的に監視し、落ちていたら/etc/init.d/polip restart を実行するようにさせています。

 埋め込む位置は、
case "$1" in
start)
echo -n "Starting $DESC: "
$PPCTL start
echo "$NAME."
nice /usr/local/bin/polipo_check.sh &
;;
stop)
echo -n "Stopping $DESC: "
$PPCTL stop
echo "$NAME."
killall polipo_check.sh
;;
#reload)
な感じで。赤字が追加部分です。ファイル名をpolipo_check.shとして、/usr/local/bin/に入れてあります。
 nice コマンドでプロセスの優先度を下げています。
 これでメモリ消費量も少なく、リソースも食わない軽量な監視ツールが出来上がりました。

0 件のコメント: