トラブルシューティング · Hetzner

Hetzner の cronジョブが動かない?修正方法はこちら

Hetzner Cloud サーバーや専用ボックスで cron ジョブが動かない場合の実践的なチェックリスト — 環境、パス、タイムゾーン、メール。

手動で実行するとうまくいく cron ジョブが Hetzner サーバーの crontab からまったく発火しない場合、ほぼ必ずいくつかの原因のどれかです。このリストを順番に確認してください。

1. cron が実際に動いているか確認

Hetzner Cloud の新しいイメージでは cron デーモンがアクティブなはずですが、確認しましょう。

systemctl status cron      # Debian/Ubuntu
systemctl status crond     # CentOS/Rocky/Alma

非アクティブの場合は有効化して起動します。

sudo systemctl enable --now cron

2. ジョブが正しい crontab にあるか確認

ユーザー crontab(crontab -e)のジョブはそのユーザーとして実行されます。/etc/crontab または /etc/cron.d/* のジョブにはユーザーフィールドが必要です。間違ったものを編集することが最もよくある間違いです。

crontab -l            # あなたのユーザーのジョブ
sudo crontab -l       # root のジョブ
cat /etc/cron.d/*     # システムジョブ(ユーザー列が必要)

3. cron では PATH が最小限

cron は最小限の環境で実行されます — 通常 PATH=/usr/bin:/bin です。nodepython3dockerpg_dump を呼び出すスクリプトは、シェルでは動いても「command not found」で失敗します。絶対パスを使うか、crontab の先頭で PATH を設定してください。

PATH=/usr/local/bin:/usr/bin:/bin
0 2 * * * /usr/local/bin/node /opt/app/job.js

4. 環境変数が不足している

cron はインタラクティブなログインのように ~/.bashrc~/.profile/etc/environment を読み込みません。依存しているシークレットや設定は単純に存在しません。明示的に source してください。

0 2 * * * . /opt/app/.env && /opt/app/run.sh

5. サーバーのタイムゾーンを確認

Hetzner のイメージはデフォルトで UTC になっていることが多いです。0 9 * * * は UTC の09:00に発火し、ローカルの09:00ではありません。確認して必要に応じて設定します。

timedatectl                       # 現在のタイムゾーンを確認
sudo timedatectl set-timezone Asia/Tokyo

6. ログを読む

cron はすべての発火をログに記録します。ジョブが見当たらない場合はマッチしていません。

grep CRON /var/log/syslog         # Debian/Ubuntu
journalctl -u cron --since today

ログ行がまったくない場合はスケジュール式が不正か、間違った crontab です。

本当の問題: 気づいたのは確認したから

上記の修正はすべて自分で確認しに行ったことを前提にしています。6週間前にサイレントに停止したジョブが最も痛いです。cron には成功や失敗の概念がなく、停止しても教えてくれません。

ハートビートを追加しましょう: ジョブが完了したときに URL に ping し、ping が欠落した瞬間にアラートを受け取ります。スクリプトの末尾に1行:

curl -fsS https://ping.steadycron.com/<your-ping-token>