仕事で複数のサーバーを扱っており、障害発生時に迅速に通知が飛んでくるようなプログラムを書いてみた。

今回はそのプログラムのコードを一部抜粋し、メインとなるコードを紹介する。

PHPからサーバーにpingを飛ばす関数

まず、pingCheckという関数を用意する。

function pingCheck($ip) {
	$PING_COUNT = 3; // ping実行回数
	$INTERVAL_SECOND = 5; // 何秒おきに実行するか

	$cmd = "ping -c ${PING_COUNT} -W ${INTERVAL_SECOND} ${ip}";
	$tmp = `$cmd`;

	if(strpos($tmp, '100% packet loss') !== false || strpos($tmp, '100.0% packet loss') !== false) {
		return false;
	}
	return true;
}

5行目で$cmd変数にシェルコマンドを用意し、次の6行目で用意したコマンドを実行する。
PHPではバッククォートでシェルコマンドを囲むことでシェルコマンドを実行し、結果を変数に格納することができる。

そして8行目のif文でサーバーの状態をチェック。

もしpingの応答がない、つまりサーバーに何らかの異常が発生した場合はfalseを返し、問題なければtrueを返す関数だ。

関数を実行する

関数が用意できたら、あとは監視対象サーバーのIPアドレスを配列で用意し、全てのIPに対し関数を実行する。

$servers = array(
	'xxx.xxx.xxx.xxx',
	'xxx.xxx.xxx.xxx',
);

foreach($servers as $ip) {
	if(!pingCheck($ip)) {
		echo "ping応答がありませんでした: ${ip}\n";		
	}
}

今回は単純にecho文でエラーを出力したが、この部分でメール送信処理や、チャットへの通知処理を実装すれば良い。

cronで定期実行する

用意したプログラムは、このままでは都度手動で実行しないといけない。

これをサーバーのcronを使って、自動実行させて常時監視させるようにする。

今回は10分おきに定期実行させる例を紹介しよう。

サーバーにSSHログインし、まず以下のコマンドを叩く。

crontab -e

すると編集画面が開くので、以下を入力する。

*/10 * * * * /usr/bin/php /home/hogehoge/ping-check/main.php

プログラムのファイルパスの部分は環境に合わせて適宜書き換える必要があるが、あとはそのまま使えるはずだ。