サーバーの定期監視をcronで回し、異常時だけ通知する
個人のサーバーで、ページの応答やリンク切れの確認をcronで毎日回し、正常なときは何も出さず、異常なときだけメールで知らせる方法を解説します。確認してはいけないURLと、通知の届け先の確かめ方も紹介します。
目次
この記事でわかること
- 定期の確認を、正常なときは黙り、異常なときだけ知らせる形にする方法
- 何を確認するかの選び方と、確認してはいけないURL
- cronのメールの届け先の決まりと、通知が本当に届くかの確かめ方
- crontabに登録するときの控えと戻し方、Claude Codeへの頼み方
結論から書くと、確認のスクリプトは「正常なら何も出さない・異常なら出力して0以外で終わる」形にし、cronのメールで受け取ります。登録したら、一度わざと失敗させて、通知が自分に届くかを確かめます。
なぜ定期の確認が要るのか
このサイトでは2026年9月23日に、記事の本文の内部リンクが、公開した初日から全記事で404になっていたことが分かりました。テストはリンク先の記事があるかを見ていましたが、実際に配信されたURLにたどり着けるかは、誰も見ていませんでした。人が指摘するまで、テストでも分かりませんでした。
こうした「静かに壊れる」不具合は、人が見に行かない限り見つかりません。そこで、ページとリンクを機械で毎日確かめる仕組みを入れました。サーバー全体の作り方はClaude CodeでAlmaLinuxサーバーを構築・運用する方法で紹介しています。
異常時だけ知らせる仕組み
cronは、ジョブが何かを出力すると、それをメールで送ります。cron(8)の説明では、出力はcrontabの持ち主に、MAILTOが書かれていればその宛先に送られます。つまり、正常なときに何も出力しないスクリプトなら、異常なときだけメールが届きます。
| 点 | 毎回出す | 異常時だけ |
|---|---|---|
| 正常なとき | 毎日届く | 何も来ない |
| 異常なとき | 埋もれる | すぐ気づく |
| ログ | 増え続ける | 増えない |
毎回結果を出す形にすると、毎日メールが届き、やがて読まなくなります。異常なときだけ出す形なら、届いたメールはすべて読む価値があります。
何を確認するか
このサイトの確認のスクリプトは、毎朝1回、次の内容を確かめています。
- 公開した記事の数と、サイトマップに載っている記事の数が合っているか
- サイトマップのすべてのURLと、固定のページが200を返すか
- 各ページの内部リンクが、すべて200を返すか
- アイキャッチの画像のファイルがあるか
2026年10月18日に手で実行したときは、70ページと内部リンク77件を約6秒で確かめ、「異常なし」でした。
一番小さな形は、1つのURLが応答するかだけを見るものです。curlの-fは、サーバーがエラーを返したときに失敗として終わらせます。-sは進み具合の表示を消し、-Sは失敗したときだけエラーを出します。
【用途】1つのURLが応答するかだけを確かめる /【実行場所】サーバー(監視のスクリプトの中) /【状態変更】なし(URLにアクセスするだけ。この記事の検証では、この例をcronに登録していません)
curl -fsS -m 10 -o /dev/null https://example.com/health || echo "NG: /health が応答しません"
このサイトのサーバーで試したところ、応答したときは何も出力されず、応答しないURLにしたときはcurlのエラーと「NG」の行が出ました。
確認に向かないURL
無人で毎日動く確認は、何にアクセスしないかも大切です。
- クリックを数えるリンク: 広告のリンクのように、踏むと回数が記録されるものは、確認で踏むと数字が実態からずれます
- 外部の広告のURL: 決まった時刻の機械的なアクセスは、不正なクリックと見なされるおそれがあります。広告は、ページに出力されているかだけを見ます
- 自分の閲覧の数: 確認のアクセスが閲覧の数に入らないよう、確認用の名前(User-Agent)を名乗り、集計から外します
このサイトでも、最初は確認の巡回が閲覧の数に入っていて、記録が4件から107件に増えました。集計から外す判定が、確認用の名前を知らなかったためです。判定に名前を足して直しました。今回の手での実行でも、前後で閲覧の数は変わりませんでした。
通知の届け先を確かめる
crontab(5)の説明では、MAILTOに宛先を書くとそこへ、空にするとメールを送らず、書かなければcrontabの持ち主に送ります。
【用途】登録済みの定期実行を読む /【実行場所】サーバー(登録したユーザー) /【状態変更】なし(一覧を表示するだけ)
crontab -l
このサイトのサーバーのcrontabにはMAILTOが無く、メールはサーバーの中のメールボックスに届く設定でした。届く場所はあっても、そこを人が読んでいなければ、異常は誰にも伝わりません。
宛先を自分が普段読むアドレスにするなら、crontabの先頭にMAILTOを書きます。次は例です。
【用途】通知の宛先と、毎朝の確認の行の例を読む /【実行場所】crontab(crontab -eで開く) /【状態変更】なし(例を示すだけ。この記事の検証では登録していません)
MAILTO=you@example.com
30 4 * * * /home/your-user/apps/myapp/healthcheck.sh
登録したら、一度だけ、わざと失敗するURLにして動かし、メールが届くかを確かめます。届いたら、元のURLに戻します。
crontabに登録する手順
crontabには、ほかの処理の行も並んでいます。書き換える前に今の内容をファイルに書き出し、問題があればそのファイルで戻します。
【用途】書き換える前に、今のcrontabの控えを取る /【実行場所】サーバー(登録するユーザー) /【状態変更】あり(ホームのフォルダに控えのテキストを残す)
crontab -l > ~/healthcheck-crontab-before.txt
crontab -eで行を足したら、crontab -lで、足した行とほかの行が残っていることを確かめます。ほかの行が消えていたときは、控えで戻します。
【用途】問題があったときに、控えのcrontabに戻す /【実行場所】サーバー(登録するユーザー) /【状態変更】あり(crontabを控えの内容で置き換える)
crontab ~/healthcheck-crontab-before.txt
このサイトは、確認の出力をログのファイルにも追記しています。正常なときは出力が無いので、2026年9月24日に登録してから10月18日まで、そのログは0バイトのままでした。ログを回す設定はlogrotateでログを管理する|設定・確認方法・postrotateの落とし穴で紹介しています。
Claude Codeに作らせる
確認する内容の案と、スクリプトの下書きは、Claude Codeに頼めます。crontabに登録する作業は、内容を読んでから自分で行います。
【用途】確認のスクリプトの案を作らせる /【実行場所】Claude Codeに頼む文 /【状態変更】なし(案と下書きを受け取るだけ)
myapp の定期の確認のスクリプトを作りたいです。
- 公開しているページと内部リンクが応答するかを確かめる案を出してください
- 正常なときは何も出力せず、異常なときだけ内容を出力して 0 以外で終わる形にしてください
- 広告のリンクや外部の URL にはアクセスしないでください
- crontab の変更は行わず、登録する行の案と、控えの取り方・戻し方を書くところで止まってください
案を受け取ったら、手元で一度動かし、正常なときに何も出ないことと、失敗させたときに出力が出ることを確かめます。障害が起きたときの切り分けはサーバー障害の切り分けをClaude Codeと進める方法にまとめています。
つまずきやすいところ
- 正常なときも結果を出力している: 毎日メールが届き、やがて読まなくなります
- MAILTOを書かず、届く場所を確かめていない: サーバーの中のメールボックスに届くだけで、誰も読んでいないことがあります
- 確認でクリックを数えるリンクを踏んでいる: 計測の数字が実態からずれます
- 確認のアクセスが閲覧の数に入っている: 確認用の名前を名乗り、集計から外します
- crontabの控えを取らずに書き換えた: ほかの処理の行を消しても、戻せません
まとめ
- 確認のスクリプトは、正常なら何も出さず、異常なら出力して0以外で終わる形にします
- cronは出力をメールで送るので、出力が無ければ通知も来ません
- クリックを数えるリンクと外部の広告のURLは、確認の対象から外します
- 登録したら、わざと失敗させて、通知が自分に届くかを確かめます
- crontabを書き換える前に控えを取り、問題があれば控えで戻します
よくある質問
cronの監視で、異常なときだけ通知するにはどうしますか?
確認のスクリプトを、正常なときは何も出力せず、異常なときだけ内容を出力して終わる形にします。cronは、ジョブの出力をcrontabの持ち主か、MAILTOに書いた宛先へメールで送ります。出力が無ければ、メールも届きません。
MAILTOを書かないと、通知はどこに届きますか?
crontabの持ち主のユーザーに届きます。サーバーの中のメールボックスに届くだけのことがあるので、自分が普段読む場所に届くかを、一度わざと異常を起こして確かめます。
定期の確認で、リクエストしてはいけないURLはありますか?
クリックを数える広告のリンクや、外部の広告のURLです。このサイトの確認は、どちらもリクエストしないようにしています。自分のページの確認でも、閲覧の数に入らないように、確認用の名前で名乗ります。
監視のスクリプトは、どのくらいの頻度で動かせばよいですか?
個人のサイトなら、ページとリンクの確認は1日1回でも、気づくまでの時間を大きく縮められます。このサイトは毎朝1回、ほかの処理と重ならない時刻に動かしています。
Claude Codeに監視のスクリプトを作らせてもよいですか?
確認する内容の案とスクリプトを書かせ、手元で試すところまでなら頼めます。crontabに登録する作業は、控えを取ってから、内容を読んで自分で行います。