ハートビートによるCronジョブ監視:実践的なチュートリアル
正常に実行される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 つを組み合わせることで、最も長い検出漏れ時間と最大の影響を持つ障害モードを検出できます。これらを配置したら、時間をかけて他のすべてのスケジュール済みジョブにハートビートを追加します。
関連記事
SSL証明書監視:2026年向け実践ガイド
SSL証明書の有効期限を監視する方法、アラートを設定すべき内容、そしてブラウザの警告を未然に防ぐ運用上の習慣について。
REST API の稼働時間と応答時間を監視する方法
REST API 監視で確認すべき項目、適切なしきい値、および ping チェックが見逃すサイレント障害をキャッチする方法。
How to Monitor DNS Propagation After a Registrar Change
How to monitor DNS records during a migration, what to check, and how to catch the silent partial-propagation failures.