ポート監視やwatchdogで簡易サーバ監視@CentOS 5

watchdog(softdog) によるサーバ高負荷・無応答寺の再起動

最後はsoftdogの設定です。

今まで書いたスクリプトはあくまでcronが動いているのが前提です。しかし、実際にはcronがエラーで動かなくなる可能性もありますし、他のプロセスがCPUを食いつぶして、動けない可能性もあります。こういう時に役に立つのがwatchdogと呼ばれる物です。watchdogはwatchdogタイマーというのをセットし、このタイマーを定期的にリセットできないとサーバを再起動させる機能です。

ハードウェアのwatchdogを使う方が、OSが異常になった場合も動くので信頼性が高いのですが、今回はソフトウェアベースのsoftdogを使います。

まずはwatchdogのモジュールを起動時に自動ロードする設定を書きます。

# vi /etc/modprobe.conf
~ 以下を追記 ~
alias char-major-10-130 softdog
options softdog soft_margin=1800

上記設定では、1800秒、つまり30分間タイマーをリセットできないと再起動されます。
※この設定を書いただけでは、まだタイマーはセットされていません。

次に定期的にタイマーをリセットする処理を、スクリプトに埋め込みます。

・スクリプト例  : watchdogリセットを追加

#!/bin/bash
nc -z localhost 80 > /dev/null
   if [ $? != 0 ]; then
   echo "Restarting httpd"
   /etc/init.d/httpd restart
   echo "done $?"
fi

nc -z localhost 25 > /dev/null
   if [ $? != 0 ]; then
   echo "Restarting Postfix"
   /etc/init.d/postfix restart
   echo "done $?"
fi
echo "a" > /dev/watchdog

上記のように、/dev/watchdog に “V” 以外の文字列を定期的に書き込むだけです。

最後にwatchtogモジュールをロードします。

# modprobe softdog

これにより、タイマーが起動します。以下のようなログが出力されます。1800秒でセットされているのもわかります。

# cat /var/log/messages
May 10 11:00:02 server1 kernel: Software Watchdog Timer: 0.07 initialized. soft_noboot=0 soft_margin=1800 sec (nowayout= 0)

スクリプトが定期的にcronで実行されていない場合は、30分後に再起動するのでご注意ください。スクリプトが正常に動いている時は、

kernel: SoftDog: Unexpected close, not stopping watchdog!

というログがリセットする度に出力されるようです。(ちょっとうざいな)
なお、ソース見たところ、/dev/watchdog に書き込むのではなく、定期的にioctlでWDIOC_KEEPALIVEを使ってリセットしてあげれば、このログは出力されないようです。(未確認)
また、設定タイムアウト値はioctlで取得できますが、後何秒で再起動されるかを確認するインタフェースはないようです。

softdo.c 抜粋
switch (cmd) {
        default:
                return -ENOTTY;
        case WDIOC_GETSUPPORT:
                return copy_to_user(argp, &ident,
                        sizeof(ident)) ? -EFAULT : 0;
        case WDIOC_GETSTATUS:
        case WDIOC_GETBOOTSTATUS:
                return put_user(0, p);
        case WDIOC_KEEPALIVE:
                softdog_keepalive();
                return 0;
        case WDIOC_SETTIMEOUT:
                if (get_user(new_margin, p))
                        return -EFAULT;
                if (softdog_set_heartbeat(new_margin))
                        return -EINVAL;
                softdog_keepalive();
                /* Fall */
        case WDIOC_GETTIMEOUT:
                return put_user(soft_margin, p);
}

softdogの手動停止は、”V” を /dev/watchdog に書き込んであげて、rmmod でモジュールをアンロードします。

# echo "V" > /dev/watchdog
# rmmod softdog

アンロード成功すると、watchdogデバイスが消えます。

# ls /dev/watchdog
ls: /dev/watchdog: そのようなファイルやディレクトリはありません

 

以上簡易的なサーバ監視でした。これで少しは楽ができるのではないでしょうか!?

 

echo “a” > /dev/watchdog 2> /dev/null
タイトルとURLをコピーしました