この記事でわかること

  • 定期の確認を、正常なときは黙り、異常なときだけ知らせる形にする方法
  • 何を確認するかの選び方と、確認してはいけない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を書き換える前に控えを取り、問題があれば控えで戻します