cron 監視の方法:ジョブが止まったことを検知する
公開日:2026-11-08
cron の失敗の通知は、ジョブが動いて失敗したときにしか届きません。サーバーの停止、crontab の消失、処理の固まりでジョブが動かなかったことに気づくには、成功するたびに外へ連絡し、連絡が途絶えたら知らせるハートビート(dead man's switch)を使います。Healthchecks.io などのサービスや、iPhone へ知らせる nodd heartbeat で組めます。
失敗の通知では気づけない止まり方
夜間のバックアップや集計のジョブは、「失敗したらメールを送る」ように作ることが多いです。ただ、この形では次の止まり方に気づけません。
- サーバーそのものが止まっている、または再起動のあと cron が動いていない
- 移行や設定の変更で crontab の行が消えた、コメントアウトされた
- ジョブが途中で固まり、終わらないまま次の実行も詰まっている
- 通知のためのメールの設定やコマンドが壊れていて、失敗の知らせ自体が出ない
どれも「失敗した」という出来事が起きないので、失敗のときに送る通知は届きません。バックアップが何週間も取れていなかったと、復元が必要になって初めて分かることになります。
ハートビート(dead man's switch)の考え方
考え方を逆にします。ジョブが成功するたびに外の仕組みへ連絡し、外の仕組みは次の連絡の期限を見張ります。期限までに連絡がなければ知らせます。死活監視、ハートビート、dead man's switch と呼ばれる方法です。
- ジョブの最後に「生きている」という連絡を送る
- 見張る側は、間隔(例: 24 時間)と猶予(例: 1 時間)から次の期限を決める
- 期限を過ぎても連絡がなければ通知する。原因が何であっても、連絡が来ないことで気づける
見張る側はジョブと別の場所で動かす必要があります。同じサーバーの中で見張ると、サーバーが止まったときに見張りも止まるからです。
Nodd を使わない方法
cron の MAILTO
cron は、コマンドが出力したものを crontab の持ち主へメールで送ります。MAILTO を設定すると宛先を変えられ、空にすると送りません。
MAILTO=ops@example.com
0 3 * * * /usr/local/bin/backup.sh
追加の仕組みが要らず、エラーの出力をそのまま読めるのが強みです。ただし、サーバーでメールを送れる設定が必要で、出力のない失敗や、動かなかったジョブには気づけません。
スクリプトを包んで終了コードで知らせる
0 3 * * * /usr/local/bin/backup.sh || notify-failure.sh backup
終了コードが 0 以外のときに Slack やメール、プッシュ通知を送る形です。失敗の理由をすぐに知らせられます。それでも、動かなかったときや固まったときには何も届きません。
Healthchecks.io や Cronitor などのサービス
ハートビートを専門に扱うサービスです。Healthchecks.io は、ジョブから決まった URL へ連絡し、期間(period)と猶予(grace time)を過ぎると知らせます。/start で開始を、/fail で失敗を、URL の末尾に終了コードを付けて結果を送れます。cron 式のスケジュールにも対応し、BSD 3-clause のオープンソースなので自分で動かすこともできます。Cronitor も、開始、完了、失敗の連絡とスケジュールから、動かなかった実行や長すぎる実行を知らせます。
0 3 * * * /usr/local/bin/backup.sh; curl -fsS -m 10 --retry 5 https://hc-ping.com/<uuid>/$?
実行時間の記録、cron 式のスケジュール、連携先の多さでは、こうした専用のサービスがいちばん充実しています。ジョブの数が多いなら、まず検討する価値があります。
Prometheus などの監視基盤
すでに Prometheus や Grafana を運用しているなら、ジョブが最後に成功した時刻を指標として出し、その時刻から一定の時間が過ぎたらアラートを出せます。Prometheus のドキュメントも、バッチジョブで最も大事な指標は最後に成功した時刻だとしています。仕組みを増やさずに済む一方、監視基盤そのものの運用が前提です。発火したアラートは 受信 URL で iPhone へ転送することもできます(監視アラートを iPhone で受ける)。
方法の比較
| 比較 | 失敗を知らせる / 動かなかったことに気づく / 必要なもの |
|---|---|
| MAILTO | 出力があれば届く / できない / メールを送れるサーバー |
| 終了コードで通知 | すぐに届く / できない / 通知の送り先 |
| Healthchecks.io、Cronitor | /fail などで届く / できる。cron 式にも対応 / サービスのアカウントか自前のサーバー |
| 監視基盤のアラート | 指標の設計しだい / できる / Prometheus などの運用 |
| Nodd | nodd send で届く / できる。間隔と猶予の秒数で見張る / iPhone と Nodd のアプリ |
nodd heartbeat で見張る
Nodd は、スクリプトや CI からの通知と確認を iPhone に届けるアプリで、ハートビートの見張りもできます。CLI を入れ、nodd login でアプリの QR を読み取るか、環境変数 NODD_KEY に送信キーを設定してから、ジョブの最後に nodd heartbeat を実行します。
0 3 * * * /usr/local/bin/backup.sh && /usr/local/bin/nodd heartbeat nightly.backup --every 86400 --grace 3600
NAMEは見張りの名前です。英数字と. _ : -の 128 文字までです--everyは次の連絡までの秒数で、60 から 2,678,400 です--graceは期限のあとに待つ秒数です。省略すると--everyの 10% です- 実行すると、次の期限を出力します
--everyと--graceの秒数のうちに次の連絡がなければ、チャンネルへ高い重要度(high)で知らせます。連絡が再開すると、再開を知らせます
&& でつなぐと、バックアップが成功したときだけ連絡します。失敗しても、動かなくても、固まっても、連絡が途絶えるので気づけます。状態はアプリのチャンネルの詳細にある「定期連絡の見張り」で、名前、最後の連絡、正常か途絶かを見られます。詳しくはマニュアルをご覧ください。
上の例は毎日 3 時のジョブです。ジョブの所要時間がばらつくなら、その分を --grace に見込みます。
失敗をすぐに知らせる
ハートビートだけだと、失敗に気づくのは期限が過ぎてからです。終了コードが 0 以外のときは、その場でアラートを送ると早く気づけます。
#!/bin/sh
# /usr/local/bin/backup-job.sh
NODD=/usr/local/bin/nodd
if /usr/local/bin/backup.sh; then
"$NODD" heartbeat nightly.backup --every 86400 --grace 3600
else
code=$?
"$NODD" send "夜間バックアップが失敗しました" --kind alert --level high \
--alert-key nightly.backup --field exit=$code
exit $code
fi
0 3 * * * /usr/local/bin/backup-job.sh
--alert-key を付けたアラートは、直したあとで解消できます。
nodd resolve nightly.backup --note "手動で取り直しました"
cron の中では PATH が対話シェルと違うことがあるので、nodd はフルパスで書くと確実です。nodd login の送信キーは、ログインしたユーザーの ~/.config/nodd/config.json に保存されます。別のユーザーの crontab で動かすなら、そのユーザーでログインするか NODD_KEY を渡します。
API で使う
CLI を入れられない環境では、API を直接呼びます。interval は必須で 60 から 2,678,400 秒、grace は 0 から 2,678,400 秒です。grace を省略すると interval の 10% で、60 秒を下回りません。
curl https://api.nodd.blipdrop.net/v1/heartbeats/nightly.backup \
-H "Authorization: Bearer $NODD_KEY" \
-H "Content-Type: application/json" \
-d '{"interval": 86400, "grace": 3600}'
200 で name と次の期限の due_at を返します。ジョブをやめるときは、見張りを止めます。止めないと、連絡が途絶えたと知らせ続けることになります。
curl -X DELETE https://api.nodd.blipdrop.net/v1/heartbeats/nightly.backup \
-H "Authorization: Bearer $NODD_KEY"
DELETE は 204 を返します。アプリの一覧の行を押して止めることもでき、止められるのは Manager、Owner、Admin です。
注意すること
- 見張りは間隔と猶予の秒数で決まります。cron 式のスケジュールはないので、平日だけ動くジョブなどは間隔の決め方に注意が要ります。こうしたジョブが多いなら、cron 式に対応したサービスのほうが向いています
- 開始の連絡や実行時間の記録はありません。固まったジョブは、連絡が途絶えることで分かります
- 見張りはチャンネルごとに 20 件までです。連絡は月の通数に数えません。失敗のときの
nodd sendは通常の通知として数えます - 途絶の知らせは高い重要度で届くので、通知しない時間帯の設定があっても鳴ります
- 無料プランは 1 人、端末 1 台、10 チャンネルです。交代で受けるチームなら Team プランです
よくある質問
- cron が失敗したときの通知だけでは足りませんか
- サーバーの停止や crontab の消失、処理の固まりでは、失敗という出来事が起きないので通知が届きません。成功のたびに連絡し、途絶えたら知らせるハートビートを組み合わせると気づけます。
- dead man's switch とは何ですか
- 決まった間隔で生きているという連絡が来ることを前提に、連絡が途絶えたら知らせる仕組みです。cron の監視では、ジョブの最後に連絡を送る形で使います。
- nodd heartbeat の猶予はどう決めればよいですか
- 省略すると --every の 10% です。ジョブの所要時間のばらつきや、開始が遅れる可能性を見込んで --grace で長めに指定します。
- ジョブをやめたら見張りはどうなりますか
- 見張りは残り、連絡が途絶えたと知らせます。DELETE /v1/heartbeats/{name} を呼ぶか、アプリの一覧から止めてください。
- Healthchecks.io と Nodd はどちらを使うべきですか
- cron 式のスケジュールや実行時間の記録、多くの連携先が必要なら Healthchecks.io などの専用サービスが向いています。途絶の知らせを iPhone で受け、承認など他の確認と同じアプリで扱いたいなら Nodd が向いています。
Nodd は、スクリプトや CI、AI エージェントからの確認を iPhone に届け、Face ID での承認を送った側のプログラムへ返すアプリです。無料プランがあります。