こんばんは、牧野です。最近急に寒くなったせいか、風邪を引きかけています。。。アシアル社内はつい最近までTシャツ一枚で過ごせるくらい暑かったのですが、この前の金曜日から急に寒くなりました。皆さんも風邪には十分お気をつけ下さい。
さて、今日はサーバ監視のTIPSです。以前紹介したcactiや、nagiosのようなソフトを使わなくても、php(とunixコマンド)だけで簡単に監視プログラムを作ることができます。(ただしunixサーバ限定です。)
今回は、監視対象サーバへのping、ウェブページへのアクセス、スクリプト設置サーバのハードディスク、メモリの使用量をチェックすることにします。プログラムは次のような感じです。
check_server.php
<?php
$SERVER_IP = 'xxx.xxx.xxx.xxx';
$URL = 'http://www.asial.co.jp';
$MAIL_TO = 'hogehoge@fugafuga';
$MAIL_FROM = 'systeminfo@fugafuga';
//pingチェック
$ping_command_str = "ping -c 3 -w 5 $SERVER_IP";
if (!strstr(`$ping_command_str`, '100% packet loss')) {
$result = "$SERVER_IP ping ok\n";
} else {
$result = "$SERVER_IP ping ng\n";
}
//webアクセスチェック
if ($res = file_get_contents($URL)) {
$result .= "{$URL} access ok\n";
} else {
$result .= "{$URL} access ng\n";
}
//ハードディスク容量チェック
$current_space = intval(disk_free_space('/') / 1024 / 1024);
$total_space = intval(disk_total_space('/') / 1024 / 1024);
$result .= 'disk free: '. $current_space .'MB/'. $total_space ."MB\n";
//メモリ使用量チェック
$memory_result = explode("\n", `free -m`);
$memory_pattern = "#^-/\+ buffers/cache: +([0-9]+) +([0-9]+)$#";
preg_match($memory_pattern, $memory_result[2], $memory_info);
$result .= 'used memory: '. $memory_info[1] .'MB/'. intval($memory_info[1] + $memory_info[2]) ."MB\n";
//結果をメール送信
$mail_header = "From: $MAIL_FROM";
mail($MAIL_TO, 'check result', $result, $mail_header);
?>
これだけです。あとは、この監視スクリプトをcronで定期的に実行するようにしておけば、監視結果がメールで送られてくるようになります。
crontab -e
*/10 * * * * /path/to/php /path/to/check_server.php
phpコマンドとスクリプトのパスはサーバの環境に合わせます。これで10分ごとに実行されます。
ちょっと直せばエラーがあったり、容量が少なくなった時だけ送るようにできます。
簡単に補足すると、、
コマンドを`(バッククォート)で囲うと実行、出力結果の取得が簡単にできて便利です。
pingコマンドは-cオプションでパケット送信の数を、-wでコマンド実行時間を指定しています。
file_get_contentsでURLにアクセスするには、allow_url_fopenが1になっている必要があるので、うまくいかない場合はphp.iniを確認します。
freeコマンドは-mオプションでメガバイトで表示させています。
freeコマンドを実行すると、
$ free -m
total used free shared buffers cached
Mem: 2026 1103 922 0 113 814
-/+ buffers/cache: 176 1849
Swap: 1983 0 1983
こんな感じで結果が出ます。
プログラムでは-/+で始まる行のusedとfreeを取り出しています。
ここのfreeの値が空きメモリだと考えて大体問題ありません。
シェルスクリプトの方が格好よくみえたりしますが、PHPからでもコマンドが使えるので同じことができます。