PHP で簡単にサーバーを監視して一定ラインを超えたらメール通知するコード

ロードアベレージ通知するだけなら負荷監視ツールを入れるより、PHP なりで書くほうが楽で簡単とのことで友達に教えてもらいましたので、ひとつ書いてみました。以下のコードを loadave.php など適当な名前で保存して cron で定期実行すれば良いです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
mb_language("ja");
mb_internal_encoding("UTF-8");
date_default_timezone_set('Asia/Tokyo');
 
$servername = 'localhost ';     // サーバー名(任意)
$mail1 = 'info@example.com';    // 通知先1
$mail2 = 'alert@example.com';   // 通知先2
$notice1 = '3.00';              // 通知ライン1
$notice2 = '5.00';              // 通知ライン2
 
$loadave = exec('uptime');
preg_match_all('/[0-9]{1,3}\.[0-9]{2}/', $loadave, $match);
$one_minute = $match[0][0] * 100;
$five_minute = $match[0][1] * 100;
$fifteen_minute = $match[0][2] * 100;
 
$template = "{$servername}のロードアベレージが %s を超えましたので通知先%d (%s) ";
$template .= "にメールを送信しました。uptime の実行結果を以下に表示します。\n\n%s";
 
if($one_minute > $notice2 * 100) {
    $message = sprintf($template, $notice2, 2, $mail2, $loadave);
    mb_send_mail($mail2, $servername . 'の負荷通知' . date(' (Y-m-d H:i:s)'), $message);
    echo $message . "\n";
} else if($one_minute > $notice1 * 100) {
    $message = sprintf($template, $notice1, 1, $mail1, $loadave);
    mb_send_mail($mail1, $servername . 'の負荷通知' . date(' (Y-m-d H:i:s)'), $message);
    echo $message . "\n";
}

通知先が2種類ある件ですが、通知先1はちょっと重いですよっていう時に通知する先、通知先2はかなり重いですよっていう時の通知先です。正確でしっかりしたものは負荷監視ツールを入れるほうがグラフィカルに見れそうではありますが、メールベースでのチェックするなら軽くて他に余計なモジュール動かさなくても良さそうなので簡単で軽そうですが、実際はどんなものでしょうか。

1
*/10 * * * * php /var/www/php/loadave.php

こんな感じで10分ごとに叩けば10分ごとにチェックできそうですが、もうちょっと効率的な方法がありそうなような気もしますので、他に方法を見つけたら記事アップさせて頂きます。

追記: PHP の閉じタグがあるのが誤りとのことでご指摘頂きましたので修正させて頂きました。以下の記事が大変参考になります。

追記: cloneko 様よりスマートな方法を教えていただきました。exec よりも sys_getloadavg の方が楽に構築できるそうです。ぜひこちらで構築させて頂きましょう。cloneko 様ありがとうございました。

コメント

  1. clonekoさんのコメント

    Twitter経由で来ました。
    PHPの関数でロードアベレージ取る関数があるのでこっち使ったほうが楽だと思います。
    下手にexec使うよりsecureだと思いますし。

    http://jp.php.net/manual/ja/function.sys-getloadavg.php

    • webleさんのコメント

      cloneko 様コメントありがとうございます。
      大変便利な関数をお教え頂き感謝致します。こちらを使ったほうがスマートに構築できますね。

  2. yuki24さんのコメント

    監視の仕組みをアプリケーションサーバに組み込むのはあまり良くありません。
    上記のスクリプトだと、環境にもよりますが、ロードアベレージが10を超えるとプロセス自体の立ち上がりが遅くなり、メールの送信自体が行われない可能性があります。
    運用しているサーバが1台のみで監視サーバを導入できない場合は、Server Density http://www.serverdensity.com/ でモニターしたり、pingdom http://www.pingdom.com/a3/ で管理を行うのがいいでしょう。両者ともに無料で導入可能です。

    • webleさんのコメント

      アドバイス頂きありがとうございます。本格的な監視をする際は他の物を入れようと思っていましたが、お教え頂きましたものを導入すれば良いということで大変勉強になりました。是非こちら使ってみて、可能であればレビューなどさせて頂きます。この度はご丁寧にありがとうございました。