crontab の書き方と早見表|5 つの欄と記号の意味・よく使う例・登録のコマンド
「毎日 3 時にバックアップ」「5 分ごとに監視スクリプト」のような定期実行は、Linux では crontab に 1 行書くだけで設定できます。ただ、「分 時 日 月 曜日」の 5 つの欄と、* , - / という記号の組み合わせは、慣れないうちは読み間違えやすく、1 時間に 60 回動いてしまったり、7 分おきのつもりが 4 分おきになったりといった事故も起きがちです。この記事では、crontab の書き方の基本と記号の意味、そのまま使える早見表、crontab -e・-l・-r の使い方、コマンド部分を書くときの注意点までを、例を中心に解説します。
crontab の 1 行は「5 つの欄+コマンド」
crontab(クーロンタブ)は、cron というプログラムに「いつ・何を動かすか」を伝える設定ファイルです。1 行が 1 つの予定で、先頭に時刻を表す 5 つの値を空白で区切って並べ、その後ろに実行したいコマンドを書きます。
| 順番 | 欄 | 書ける値 | 例 |
|---|---|---|---|
| 1 つ目 | 分 | 0〜59 | 30 → 30 分 |
| 2 つ目 | 時 | 0〜23(24 時間制) | 9 → 9 時、21 → 21 時 |
| 3 つ目 | 日 | 1〜31 | 1 → 1 日 |
| 4 つ目 | 月 | 1〜12(JAN〜DEC も可) | 4 → 4 月 |
| 5 つ目 | 曜日 | 0〜7(0 と 7 が日曜、SUN〜SAT も可) | 1 → 月曜、5 → 金曜 |
たとえば「30 3 * * * /home/user/backup.sh」は、「分が 30・時が 3・日も月も曜日も問わない」なので、毎日 3:30 に backup.sh を実行する、という意味になります。並び順は「小さい単位から大きい単位へ」ですが、曜日だけは最後に来る点に注意してください。時と分の順番を逆に書いてしまう(9 時 30 分のつもりで「9 30」と書く)ミスはとても多く、その場合は「毎日 30 時 9 分」となり、時の欄に 30 は書けないのでエラーになります。
記号の意味:* , - / の 4 つを覚えれば読める
数字のほかに、cron 式では 4 つの記号を使います。どの欄にも同じ意味で使えるので、この 4 つを押さえればほとんどの式が読めるようになります。
| 記号 | 意味 | 例 | 例の読み方 |
|---|---|---|---|
| * | すべて(その欄で絞らない) | 0 9 * * * | 毎日 9:00 |
| , | 複数の値を並べる | 0 9,18 * * * | 毎日 9:00 と 18:00 |
| - | 範囲(〜から〜まで) | 0 9 * * 1-5 | 月〜金の 9:00 |
| / | 間隔(ごと) | */15 * * * * | 毎時 0・15・30・45 分 |
| - と / の組み合わせ | 範囲の中で間隔 | 0 9-17/2 * * * | 9・11・13・15・17 時の 0 分 |
| , と - の組み合わせ | 範囲を複数 | 0 9 * * 1-3,5 | 月・火・水・金の 9:00 |
/ は「その欄の最初の値から n ずつ数える」という意味です。「*/15」は「0 から 15 ずつ」なので 0・15・30・45 分、「5-59/15」なら 5・20・35・50 分になります。「15 分たったら次」というタイマーではなく、あくまで「その数字の分に動く」という指定だと理解しておくと、次の節の落とし穴を避けられます。
また、@daily(毎日 0:00)、@hourly(毎時 0 分)、@weekly(日曜 0:00)、@monthly(毎月 1 日 0:00)、@yearly(1 月 1 日 0:00)、@reboot(起動時に 1 回)のように、5 つの欄の代わりに使える短い書き方もあります。読みやすい反面、時刻が 0:00 に固定されるので、深夜 0 時にほかの処理と重なりやすい点には気をつけてください。
そのまま使える crontab 早見表
よく使う指定を一覧にしました。時刻はサーバーのタイムゾーンでの時刻です。コマンドの部分は省略しているので、式の後ろに実行したいコマンドを続けて書いてください。
| やりたいこと | cron 式 | 補足 |
|---|---|---|
| 1 分ごと | * * * * * | 1 日 1,440 回動く |
| 5 分ごと | */5 * * * * | 毎時 0・5・10…55 分 |
| 10 分ごと | */10 * * * * | 毎時 0・10・20…50 分 |
| 30 分ごと | */30 * * * * | 毎時 0 分と 30 分 |
| 1 時間ごと(毎時 0 分) | 0 * * * * | @hourly と同じ |
| 2 時間ごと | 0 */2 * * * | 0・2・4…22 時 |
| 6 時間ごと | 0 */6 * * * | 0・6・12・18 時 |
| 毎日 0:00 | 0 0 * * * | @daily と同じ |
| 毎日 3:30(深夜バッチ) | 30 3 * * * | 0 時ちょうどを避けると混雑しにくい |
| 毎日 9:00 と 18:00 | 0 9,18 * * * | 分が同じ時刻ならまとめられる |
| 平日(月〜金)9:00 | 0 9 * * 1-5 | |
| 平日 9〜18 時の 30 分ごと | */30 9-18 * * 1-5 | 18:30 も動く |
| 土日 10:00 | 0 10 * * 0,6 | 日曜は 0 でも 7 でもよい |
| 毎週月曜 9:00 | 0 9 * * 1 | |
| 毎週金曜 17:30 | 30 17 * * 5 | |
| 毎月 1 日 0:00 | 0 0 1 * * | @monthly と同じ |
| 毎月 1 日と 15 日 9:00 | 0 9 1,15 * * | |
| 四半期の初日(1・4・7・10 月 1 日) | 0 0 1 */3 * | |
| 毎年 1 月 1 日 0:00 | 0 0 1 1 * | @yearly と同じ |
| 起動したときに 1 回 | @reboot | crontab(Linux)だけの書き方 |
「毎月末日」「毎月第 2 火曜」「最終金曜」のように、crontab の 5 つの欄だけでは正確に書けない指定もあります。これらはコマンド側で日付を確かめる書き方が必要になるため、cron の日と曜日の OR と第 n 曜日・月末の書き方で詳しく解説しています。
*/7 は 7 分おきにならない:間隔指定の落とし穴
「*/n」は「0 から n ずつ数えて、その欄の最大値を超えたら終わり」という意味です。分の欄なら 0〜59 の中で数えるので、60 を割り切れない数を指定すると、毎時 0 分のところで間隔が崩れます。
| 式 | 実際に動く時刻 | 崩れる箇所 |
|---|---|---|
| */7 * * * * | 毎時 0・7・14・21・28・35・42・49・56 分 | 56 分 → 次の 0 分が 4 分間隔 |
| */25 * * * * | 毎時 0・25・50 分 | 50 分 → 次の 0 分が 10 分間隔 |
| */45 * * * * | 毎時 0・45 分 | 45 分 → 次の 0 分が 15 分間隔 |
| 0 */5 * * * | 0・5・10・15・20 時 | 20 時 → 翌 0 時が 4 時間間隔 |
| 0 */7 * * * | 0・7・14・21 時 | 21 時 → 翌 0 時が 3 時間間隔 |
分なら 1・2・3・4・5・6・10・12・15・20・30、時なら 1・2・3・4・6・8・12 のように、60 や 24 を割り切れる数であれば間隔はそろいます。それ以外の間隔でどうしても均等に動かしたい場合は、cron を 1 分ごとや 1 時間ごとに動かし、スクリプトの中で前回からの経過時間を見て実行するかを決める、という書き方になります。
crontab -e・-l・-r の使い方と、消してしまわないための注意
crontab の設定は、ファイルを直接開くのではなく crontab コマンドで編集します。ユーザーごとに別の crontab があり、コマンドを実行したユーザーの設定が対象になります。
- 1
crontab -l で今の設定を確認する
登録されている行がすべて表示されます。何も登録されていなければ「no crontab for ユーザー名」と出ます。編集の前に crontab -l > ~/crontab.bak として、バックアップを取っておくと安心です。
- 2
crontab -e で編集する
エディタが開くので、1 行に 1 つの予定を書いて保存・終了します。保存した時点で cron に反映され、cron の再起動は不要です。書式に誤りがあると保存時にエラーが出て、もう一度編集するかを聞かれます。
- 3
最後の行のあとに改行を入れる
最後の行に改行がないと、その行が読み込まれない cron の実装があります。最終行のあとで Enter を押してから保存する習慣をつけましょう。
- 4
root やほかのユーザーの設定は sudo crontab -u
sudo crontab -u www-data -l のように -u で対象のユーザーを指定します。どのユーザーで登録したかによって、ファイルの権限や使える環境変数が変わります。
なお、/etc/crontab や /etc/cron.d/ の下のファイルは書式が少し違い、5 つの欄とコマンドの間に「実行するユーザー名」の欄が入ります(例: 30 3 * * * root /usr/local/bin/backup.sh)。ユーザーの crontab と同じ書き方でコピーすると、コマンド名がユーザー名として読まれて動きません。
コマンド部分を書くときの 4 つの注意
時刻の 5 つの欄が正しくても、コマンドの書き方が原因で「手で実行すると動くのに cron だと動かない」ということがよくあります。cron は、ログインしたときとは違う最小限の環境でコマンドを実行するためです。
- コマンドやファイルは絶対パスで書く。cron の PATH は /usr/bin:/bin 程度しかなく、/usr/local/bin などに入ったコマンドは見つからない
- % はエスケープする。crontab のコマンド中の % は改行として扱われるため、date +%Y%m%d は date +\%Y\%m\%d と書く
- 出力をログに残す。「>> /var/log/backup.log 2>&1」を末尾に付けると、エラーも含めて追記で記録できる
- シェルは /bin/sh。bash 専用の書き方([[ ]] や配列など)を使うなら、bash のスクリプトにして先頭に #!/bin/bash を書く
これらを踏まえると、たとえば「平日 9:00 に、日付入りのファイル名でレポートを出力する」設定は「0 9 * * 1-5 /usr/local/bin/report.sh > /home/user/report-$(date +\%Y\%m\%d).txt 2>&1」のようになります。それでも動かない場合の調べ方は、cron が動かない原因チェックリストで順番に解説しています。
書いた式が意図どおりかを確かめるには、cron 式チェッカーに crontab の行をそのまま貼るのが手軽です。「平日(月〜金)の 9:00」のように日本語に訳し、次の実行日時を 10 件並べるので、曜日や時刻の取り違えにすぐ気づけます。コマンド部分の % のエスケープ忘れも知らせます。
よくある質問
- crontab で 5 分おきに実行するにはどう書きますか?
- 「*/5 * * * * コマンド」と書きます。毎時 0・5・10…55 分に動き、1 時間に 12 回、1 日に 288 回実行されます。平日の 9〜18 時だけにしたいなら「*/5 9-18 * * 1-5」のように時と曜日の欄で絞ります。
- crontab の曜日の数字は何番が月曜ですか?
- 0 が日曜、1 が月曜、2 が火曜…6 が土曜で、7 も日曜として扱われます。平日(月〜金)は 1-5、土日は 0,6 です。MON や FRI のような英語の 3 文字でも書けます。AWS EventBridge では 1 が日曜と 1 つずれるので注意してください。
- crontab を編集したら cron の再起動は必要ですか?
- crontab -e で編集した場合は、保存した時点で自動的に反映されるので再起動は不要です。サーバーのタイムゾーンを変更したときは、cron が古いタイムゾーンのまま動き続けることがあるため、cron(または crond)のサービスを再起動します。
- crontab -r で消してしまった設定は復元できますか?
- crontab -r は設定を確認なしで削除し、元に戻す機能はありません。バックアップ(crontab -l の出力を保存したファイル)があれば crontab ファイル名 で書き戻せます。バックアップがない場合は、cron のログ(syslog など)に残っている実行履歴から、どのコマンドがいつ動いていたかを手がかりに書き直すことになります。
- 「*/7」で 7 分おきにならないのはなぜですか?
- */7 は「0 分から 7 ずつ数えて 59 分まで」という意味で、0・7・14…56 分に動きます。56 分の次は 63 分ではなく次の時間の 0 分になるため、そこだけ間隔が 4 分になります。60 を割り切れる 5・10・15・20・30 などを使うと間隔がそろいます。
この記事で紹介したツール
あわせて読みたい
GitHub Actions の cron を日本時間で動かす|UTC 変換の早見表と曜日ずれ・遅延の対策
GitHub Actions の schedule に「0 9 * * 1-5」と書いたのに、ワークフローが動いたのは日本時間の夕方 6 時だった。これは書き間違いではなく、GitHub Actions の cron が必ず UTC(協定世界時)で読まれるためです。この記事では、日本時間(JST)の時刻を UTC の cron 式に直す計算と早見表、朝 0〜8 時を指定したときに起きる「曜日・日付が前の日にずれる」問題、1 行で書けないときの 2 行への分け方、そして schedule が遅れる・動かないときの原因と対策までをまとめます。
記事を読む →cron が動かない原因チェックリスト|手動では動くのに失敗する理由とログの確認方法
crontab に書いたはずのバッチが動いていない。ターミナルで手で実行すると成功するのに、cron からだと何も起きない。cron のトラブルは、エラーがどこにも表示されないまま静かに失敗することが多く、原因を探すのに時間がかかりがちです。この記事では、cron が動かないときに確かめる順番を「式」「cron 本体」「ログ」「実行環境」「ファイルと権限」「タイムゾーン」に分けて整理し、手動では動くのに cron だと失敗する典型的な理由と、その直し方をまとめます。
記事を読む →EventBridge の cron 式の書き方|? の意味・曜日の数字・日本時間の指定と crontab からの書き換え
AWS で Lambda や ECS のタスクを定期実行するときに使う EventBridge の cron 式は、Linux の crontab と似ているようで、欄の数・? の使い方・曜日の数字・タイムゾーンが少しずつ違います。crontab の感覚で「0 9 * * 1-5」と書くとエラーになり、曜日の数字をそのまま移すと 1 日ずれ、時刻は UTC で読まれて 9 時間ずれる、とつまずきどころが重なります。この記事では、EventBridge の cron 式の 6 つの欄と ? のルール、曜日の数字、L・W・# の使い方、rate 式との違い、ルールと Scheduler での日本時間の扱い、crontab・Kubernetes・Spring・systemd との書き換え表までをまとめます。
記事を読む →