Home
プリント
title.gif.gif

   トップ自分で作る管理用スプリクト > cronの実行状況をWebブラウザでチェックする


ya_red.gif.gif 【スプリクト2】 cronの実行状況をWebブラウザでチェックする .gif browser.gif  


何らかのサービスを運営している場合、定期バッチ(cronによる自動起動)を利用します。一度設定してしまえば、提示には実行されるものなのですが、何らかの要因(人為的ミス)が加わると、実行されない場合もあるので日々チェックすることにこしたことはありません。

私の場合、データのメンテナンス作業のために一時的にcronを停止し、そのまま戻し忘れた(正確にはcronデーモンの再起動を行わなかった)ことによって、痛い目に合いました。(^^; やはり日々確認することが重要ですね。

また、cronの実行時間を監視することにより、その前に起こったサービスの異常や、負荷の有無に気がつくことがあります。cron実行の有無はもちろん、その実行時間を毎日監視していることによって、トラブルの前兆を見つけることができます。


Debianのデフォルトインストールの場合、cron実行ログは /var/log/auth.log に記録されます。
通常、/var/log/auth.log を参照すればいいのですが、/var/log/auth.log はいろいろな認証のログも書き込まれるため、パーミッションは640になっています。 これではWebからでは読み込めませんね。
グループの読み取り許可はあるので、Aapacheの実行グループを変更する方法もありますが、それではセキュリティの穴を拡大させるだけなので、私の場 合、/var/log/auth.log からcronに関するログだけ抽出したものを新しいファイルに出力して、そのファイルを参照するようにしています。また、サーバが複数あるので、他サー バーからもcronのログを転送し、複数サーバのcron実行状況を一画面(ブラウザ)で見えるようにしています。

サンプルでは、/var/log/auth.log を直接読むようになっていますが、環境に合わせてその点を適当に修正してみて下さい。

出力されるのはこんなイメージ

.gif


PHPソースはこんな感じ


echo "<html><head><meta http-equiv=Content-Type content=text/html; charset=Shift_JIS>\n";
echo "<style type='text/css'>\n";
echo ".red { color: red; font-weight: bold; }\n";
echo "p.head { background: #fff; margin: 0px 20px; padding: 10px; border: 1px dotted #aaa; }\n";
echo "p.list { background: #fff; margin: 5px 20px; padding: 20px; border: 1px dotted #aaa; }\n";
echo "</style></head><body bgcolor=#DDF3DE>\n";

exec("hostname",$result0);
$YMD = date('Y/m/d H:i:s', time());
echo "<p align=right><b>$result0[0] $YMD</b></p>\n";


//cron稼働状況チェック
echo " <div align=center><br><b>--------------------- cron稼働状況チェック ---------------------</b><br></div>\n";
$GrepList = array("postgres", "www");    ←リスト化するユーザー名を設定

while (list($G_key, $G_value) = each($GrepList)) {

    exec("grep $GrepList[$G_key] /var/log/auth.log",$result1);
    $s_start_table = array();

    while (list($key, $value) = each($result1)) {
        list($month,$day,$time,$server,$s_id,$work2,$work3,$sta) = split ('[ ]+', $value);
        $s_id = str_replace('PAM_unix', '', $s_id);
        $date_array = getdate();
        $s_YMD = $day . " " . $month . " " . $date_array[year] . " " . $time;
        $s_U = date('U', strtotime($s_YMD));

            $s_YMD = $month . " " . $day . " " . $time;
        if ($sta == 'opened') { $s_start_table[$s_id] = $s_YMD; $s_start_table_U[$s_id] = $s_U; }
        if ($sta == 'closed') { $s_end_table[$s_id] = $s_YMD; $s_end_table_U[$s_id] = $s_U; }
    }
    echo "<br><p class=head><b>ユーザー $GrepList[$G_key] の実行結果</b></p>\n";
    echo "<p class=list><table border=0>\n";
    while (list($key, $value) = each($s_start_table)) {
        $exe_time = $s_end_table_U[$key] - $s_start_table_U[$key];
        $exe_time_min = floor($exe_time / 60);
        $exe_time_divide = $exe_time - $exe_time_min * 60;
        echo "\t<tr><td>$key $GrepList[$G_key]</td><td>開始:$value</td><td> 終了: $s_end_table[$key]</td><td> 実行時間:</td>";
        if ($exe_time > 180 ) {    ←赤文字表示する実行時間上限値を設定(秒)
            echo "<td class=red>$exe_time_min 分 $exe_time_divide 秒</td></tr>\n";
        } else {
            echo "<td>$exe_time_min 分 $exe_time_divide 秒</td></tr>\n";
        }
    }
    echo "</table></p>\n";
}
echo "</body></html>\n";


 

 


ダウンロード
(1.35KB lzh形式)



【プログラム設置の注意】
今回のようにシステム管理用のコマンドを使ったり、システムログを覗いたりするプログラムを作った場合、スクリプトの置き場所に細心の注意を払わなければ なりません。 スクリプトにセキュリティホールを作らないようにするのはもちろんですが、Webサーバー側でパスワード認証を行ったり、管理用コンテンツ 専用のポートを設置したり、IPフィルターをかけたりといくつものアクセス制限の対策を施するべきでしょう。

設置する前にアクセス制限がうまく機能しているか、試してみるのがいいと思います。


【その他】
・ダウンロードはもちろん無料です。
・社内で使うツールなので、性能さえ落ちなければコーディングのキレイさは求めないで適当に作っています。ご了承下さい。
・この程度のプログラムに著作権などがあるわけもないので、カスタマイズは自由に行って下さい。