【php】cronのプロセスを監視する
はじめに
開発環境と現状はこんな感じ
・PHPで開発したスクリプトをcronで起動
・処理時間が1日とかかかる
・いちおうエラー処理も実装したが途中で処理落ちすることがある(原因が特定できていない)
で、やりたかったことは処理が落ちたらアラートメールとか送信して気づくようにしたい
というのをなるべくシンプルな形で実装したかった。
実装
何かツール探したり、常とう手段ぽいのがあるかなと思って検索したけどいまいち見つけることができなかった。
なのでDBに以下のようなテーブルを作ってバッチ処理の状況を管理する形で自前で実装
バッチ管理テーブル(batches)
id | ID | PK オートインクリメント |
process_id | プロセスID | |
batch_id | バッチ処理ID | |
started | 処理開始日時 | |
ended | 処理終了日時 | |
status | ステータス | 1:処理中 2:処理終了 3:異常終了 |
プロセスID : psコマンドで取れるやつ
バッチ処理ID : バッチを識別できるようなユニークなやつ
各バッチ
$batch_id = "BATCH-1" // バッチ処理ごとにユニークになるように $process_id = getmypid(); // 開始処理 $sql = "insert into batches " .= "(process_id, batch_id, started, ended, status) values" .= "($process_id, $batch_id, now(), null, 1)"; //$sql実行 => $id = オートインクリメント値 // 処理実装 // ・・・ // 終了処理 $sql = "update batches set ended = now(), status = 2 where id = $id"; // $sql実行
監視バッチ
$sql = "select id, process_id, batch_id from batches where status = 1"; // $sql実行 => $batch_list foreach ($batch_list as $batch) { $cmd = "ps {$batch['process_id']} | grep {$batch['batch_id']}"; exec($cmd, $output); if (empty($output)) { // アラート通知 $sql = "update batches set status = 3 where id = {$batch['id']}" // $sql実行 } }
おわりに
そもそも処理落ちする原因をちゃんと特定しろって話ですが。。。
あと、突っ込みどころ多いと思いますが、なんかいいツールとかもあったら教えてください。以上です