← すべての記事
モニターの種類 · 読了時間 8 分

ハートビートによるCronジョブ監視:実践的なチュートリアル

A wall of analog clocks at slightly different times in a modern office.

正常に実行されるcronジョブは簡単です。失敗を大声で通知するcronジョブも簡単です。エラーメールが受信トレイに届きます。難しいのは、完全に実行を停止するcronジョブです。サーバーが再起動され、コンテナがEvictされ、ユーザーアカウントが無効化され、systemdタイマーが設定変更でマスクされた。ジョブは実行されず、エラーも生成されず、バックアップが実行されていると思っていたのに3週間後に何も存在しないことに気づきます。ハートビート監視はまさにこの障害モードをキャッチします。

ハートビート監視がどのように機能するか

ハートビート監視は通常のプローブ関係を反転させます。外部プローバーがサービスを呼び出す代わりに、ジョブがモニターを呼び出します。猶予期間を定義します(例:「このジョブは1時間ごとにpingする必要があり、5分の猶予を与える」)。モニターがpingを受信しなくなると、ダウンタイムイベントを開いてアラートします。

結果はデッドマンスイッチになります。ジョブが実行され、成功を報告している限り、モニターは沈黙します。pingに失敗した瞬間(クラッシュしたため、サーバーがオフになったため、誰かがタイマーを無効化したため)、アラートが発火します。3週間のサイレントバックアップ障害が5分のインシデントになります。

ハートビートと定期チェックをいつ使用するか

ハートビートはHTTP監視の代替品ではありません。スケジュール上で帯域外で実行されるあらゆるジョブをカバーしています。

  • バックアップジョブ: 夜間ダンプ、S3 同期、オフサイト rsync。
  • データパイプラインの実行: ETL ジョブ、日次レポート生成、請求調整。
  • スケジュール済みマーケティングメール: 週刊ニュースレター、ドリップキャンペーン。
  • SSL 更新ジョブ: certbot、acme.sh。
  • cron、systemd タイマー、GitHub Actions スケジュール、Cloudflare Workers cron、または AWS EventBridge で実行されるもの。

Bash cron ジョブにハートビートを追加する方法

最もシンプルなパターンは、スクリプトの最後に単一の curl 呼び出しを実行することです。ハートビート URL はモニターごとに一意です。バージョン管理にチェックインしないでください。

障害を優雅に処理するパターン: `do_the_work && curl -fsS --retry 3 https://your-monitor.example/heartbeat`。&& は実際の作業が成功した場合にのみハートビートをトリガーします。--retry 3 は一時的なネットワークの問題に対応します。-fsS は curl を成功時は静か、失敗時はうるさくします。これが cron が求めるものです。

Python と Node からのハートビート

2 つの一般的な言語での同じパターン。どちらも try/except で作業をラップし、クリーンな実行でのみ成功を報告します。

  • Python: `try: do_the_work(); requests.post('https://your-monitor.example/heartbeat', timeout=10); except Exception: logger.exception('job failed')`
  • Node: `try { await doTheWork(); await fetch('https://your-monitor.example/heartbeat', { method: 'POST' }); } catch (err) { console.error('job failed', err); }`
  • 重要: finally ブロックでハートビートを送信しないでください。Finally は成功時と失敗時の両方で実行されます。ハートビートは成功を示すポジティブなシグナルであり、単なる実行履歴ではありません。

グレースウィンドウの設定

グレースウィンドウは最も一般的に誤設定されるパラメータです。短すぎると、ジョブが数秒遅れて実行されたときに誤ったアラームが発生します。長すぎると、実際の障害が数時間気づかれなくなります。

一般的な目安は、通常のジョブ実行時間の 2 倍に 5 分を加えたものです。通常 8 分かかる夜間バックアップでは、8 * 2 + 5 = 21 分のグレースウィンドウが必要です。2 時間かかる週次ジョブでは、2 * 2 + 0.5 = 4.5 時間のグレースウィンドウが必要です。グレースウィンドウは実際の障害ではなく、無害な変動から保護します。

最初に設定する一般的なハートビートパターン

ゼロから始める場合、3 つのハートビートで人々を悩ませるサイレント障害のほとんどを検出できます。6 時間のグレースウィンドウを持つ夜間バックアップモニター。certbot または acme.sh を実行する cron 上の SSL 更新モニター(1 週間のグレースウィンドウ付き)。90 分のグレースウィンドウを持つ日次レポートまたは請求調整モニター。これら 3 つを組み合わせることで、最も長い検出漏れ時間と最大の影響を持つ障害モードを検出できます。これらを配置したら、時間をかけて他のすべてのスケジュール済みジョブにハートビートを追加します。

MonitorAHを無料で試す

3つのモニター、1分以内のアラート、クレジットカード不要。この段落を読む時間で、ウェブサイト1つとcronジョブ1つをカバーできます。

監視を開始

関連記事