読者です 読者をやめる 読者になる 読者になる

【php】cronのプロセスを監視する

はじめに

開発環境と現状はこんな感じ
PHPで開発したスクリプトをcronで起動
・処理時間が1日とかかかる
・いちおうエラー処理も実装したが途中で処理落ちすることがある(原因が特定できていない)

で、やりたかったことは処理が落ちたらアラートメールとか送信して気づくようにしたい
というのをなるべくシンプルな形で実装したかった。

実装

何かツール探したり、常とう手段ぽいのがあるかなと思って検索したけどいまいち見つけることができなかった。
なのでDBに以下のようなテーブルを作ってバッチ処理の状況を管理する形で自前で実装

バッチ管理テーブル(batches)

idIDPK オートインクリメント
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実行
  }
}

おわりに

そもそも処理落ちする原因をちゃんと特定しろって話ですが。。。
あと、突っ込みどころ多いと思いますが、なんかいいツールとかもあったら教えてください。以上です