アシアルブログ

アシアルの中の人が技術と想いのたけをつづるブログです

PHPスクリプト1つでできる簡単サーバ監視

こんばんは、牧野です。最近急に寒くなったせいか、風邪を引きかけています。。。アシアル社内はつい最近まで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からでもコマンドが使えるので同じことができます。