Linux Cron チートシート
Node アプリを Linux サーバーにデプロイし、毎晩午前 3 時にスクリプトを実行する必要があります。cron については聞いたことがあるものの、構文が暗号のように見え、見つけたチュートリアルは古いか不正確な情報で溢れています。この Linux cron チートシートは、信頼性の高い cron ジョブスケジューリングに必要な、正確でディストリビューションを考慮したリファレンスを提供します。
重要なポイント
- Cron は 5 つのフィールド形式(分、時、日、月、曜日)を使用し、その後に実行するコマンドを記述します。
- 日と曜日の両方を指定した場合、cron はそれらを AND ではなく OR として扱います。これは予期しない動作の一般的な原因です。
- Cron は限定的でディストリビューション依存の環境で実行されるため、常に絶対パスを使用し、移植性のために PATH を明示的に設定してください。
- Linux ディストリビューションによって異なる cron 実装が使用され、機能サポートも異なります。
Crontab 構文:5 フィールド形式
すべての cron ジョブは次の構造に従います:
┌───────────── 分 (0-59)
│ ┌─────────── 時 (0-23)
│ │ ┌───────── 日 (1-31)
│ │ │ ┌─────── 月 (1-12)
│ │ │ │ ┌───── 曜日 (0-6, 日曜日=0)
│ │ │ │ │
* * * * * command
特殊文字:
*— 任意の値,— リスト区切り文字 (1,3,5)-— 範囲 (1-5)/— ステップ値 (*/15 は 15 ごとを意味します)
重要: L、W、#、? などの文字は Quartz スケジューラー構文であり、標準の cron ではありません。Linux の crontab では使用しないでください。不明な場合は、man 5 crontab でシステム独自のドキュメントを確認してください。
一般的なスケジューリングパターン
*/5 * * * * # 5 分ごと
0 * * * * # 毎時 0 分
0 3 * * * # 毎日午前 3 時
0 0 * * 0 # 毎週日曜日の午前 0 時
0 0 1 * * # 毎月 1 日
特殊文字列
ほとんどの cron 実装はこれらのショートカットをサポートしています(BusyBox などの最小限のシステムではサポートが異なる場合があります):
| 文字列 | 同等の表現 |
|---|---|
@reboot | 起動時に 1 回実行 |
@hourly | 0 * * * * |
@daily | 0 0 * * * |
@weekly | 0 0 * * 0 |
@monthly | 0 0 1 * * |
@yearly | 0 0 1 1 * |
@reboot はネットワークや他のサービスが利用可能であることを保証しないことに注意してください。依存関係を考慮した起動ジョブには、通常 systemd タイマーの方が適しています。
日と曜日の落とし穴
日と曜日の両方を指定すると、cron はそれらを AND ではなく OR として扱います:
0 0 15 * 1 # 15 日または月曜日に実行
これは多くの人を驚かせます。「15 日で、かつ月曜日の場合のみ」が必要な場合は、スクリプト内でそのロジックを処理してください。
環境の取り扱い
Cron は限定的で非対話的な環境で実行されます。ここがほとんどのジョブが静かに失敗する原因です。
PATH の動作はディストリビューションとバージョンによって異なります:
- 一部のシステムは最小限のデフォルト PATH を定義します
- その他(特に新しい Ubuntu リリース)は、サービス環境から PATH を継承する場合があります
デフォルトに依存しないでください。移植性と予測可能な動作のために、必要なものを明示的に設定してください。
安全な実践:
# crontab の先頭で変数を設定
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
MAILTO=""
# 常に絶対パスを使用
0 3 * * * /usr/bin/node /home/deploy/app/cleanup.js
注意: MAILTO はローカル MTA がインストールされ、設定されている場合にのみ機能します。多くの最新サーバーには MTA がありません。メールに依存するのではなく、出力を明示的にリダイレクトしてください。
Discover how at OpenReplay.com.
出力とログ記録
# すべてをログに記録
0 3 * * * /path/to/script.sh >> /var/log/myjob.log 2>&1
# すべての出力を破棄
0 3 * * * /path/to/script.sh >/dev/null 2>&1
# エラーのみをログに記録
0 3 * * * /path/to/script.sh >/dev/null 2>> /var/log/myjob-errors.log
必須の Crontab コマンド
crontab -e # crontab を編集
crontab -l # 現在のジョブを一覧表示
crontab -r # すべてのジョブを削除(注意!)
システム全体のジョブには、/etc/cron.d/ ファイルを使用してください。/etc/cron.daily/、/etc/cron.hourly/ などは run-parts を介して実行され、cron によって自動的にスキャンされるわけではないことに注意してください。命名規則と実行ルールについては man 8 run-parts を参照してください。
Cron 実装は異なります
システムによって異なる cron デーモンが実行されます:
- Debian/Ubuntu: cron (Vixie 系統、ディストリビューションパッチ適用)
- RHEL/Fedora: Cronie
- Alpine/コンテナ: BusyBox
crond
機能サポート(特殊文字列、メール動作、ログ記録)は異なる場合があります。常にローカルの crontab(5) マニュアルページで確認してください。
Cron vs Systemd タイマー
| 考慮事項 | Cron | Systemd タイマー |
|---|---|---|
| セットアップの複雑さ | シンプル | より冗長 |
| 実行失敗時の処理 | スキップ | 設定可能 (Persistent=true) |
| 依存関係 | なし | サービス/マウントを待機可能 |
| ログ記録 | 手動 | journald に組み込み |
Cron を使用する場合: どこでも動作するシンプルで移植性の高いスケジューリングが必要な場合。
Systemd タイマーを使用する場合: 依存関係管理、再起動を跨いだ永続的なスケジューリング、または最新の Linux システムとのより良い統合が必要な場合。タイマーユニットに関する systemd プロジェクトのドキュメントが正式なリファレンスです。
クイックデバッグチェックリスト
- Cron は実行中ですか?
systemctl status cronまたはsystemctl status crond(サービス名はディストリビューションによって異なります) - ログを確認:
grep CRON /var/log/syslog(Debian/Ubuntu) または/var/log/cron(RHEL/Fedora) - 制限された環境でコマンドを手動でテストする
- すべてのコマンドとファイルの絶対パスを確認
- スクリプトのファイル権限を確認
まとめ
Cron は Linux でジョブをスケジュールする最もシンプルな方法です。5 フィールド構文をマスターし、日フィールドを組み合わせた場合の OR 動作を理解し、ディストリビューション固有の環境動作を考慮してください。これらの基礎を押さえれば、スケジュールされたタスクは何年も確実に実行されます。
よくある質問
最も一般的な原因は環境の問題です。Cron はシェルとは異なる限定的で非対話的な環境で実行され、PATH の動作はディストリビューションによって異なります。常に絶対パスを使用し、必要な変数を明示的に設定し、cron サービスが実行中であることを確認し、システムログでエラーを確認してください。
曜日フィールドで月曜日(1)から金曜日(5)までの範囲を使用します。たとえば、平日の午前 9 時に実行するには: 0 9 * * 1-5 /path/to/script.sh を使用します。標準の cron 構文では、日曜日は 0、土曜日は 6 であることを覚えておいてください。
ユーザー crontab は crontab -e で編集され、ユーザーごとに保存されます。/etc/cron.d/ のシステム crontab には、時刻指定の後に追加のユーザー名フィールドがあり、どのユーザーがコマンドを実行するかを示します。システム crontab は、サービスや共有管理により適しています。
cron を模倣した最小限の環境でコマンドを手動で実行します。たとえば: env -i PATH=/usr/bin:/bin /path/to/script.sh。これにより、静かな失敗を引き起こす可能性のある依存関係の欠落やパスの問題を明らかにできます。
Gain control over your UX
See how users are using your site as if you were sitting next to them, learn and iterate faster with OpenReplay. — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.