🐧 Linux 総合学習プラットフォーム
自動化/定期実行 ・ 中級

crontab の書式(5フィールド)

crontab の1行は「分 時 日 月 曜日 コマンド」の順で書きます。先頭の5つが実行タイミングを表すフィールドで、それぞれ分(0-59)・時(0-23)・日(1-31)・月(1-12)・曜日(0-7、0と7が日曜)です。アスタリスク * は「毎」を意味し、*/5 は「5ごと」、1,15 は「列挙」、1-5 は「範囲」を表します。例えば 0 3 * * * は毎日午前3時0分、*/10 * * * * は10分おきの実行になります。

cron を使いこなす鍵は、crontab に書く1行の書式を正しく読み書きできることに尽きます。crontab の各行は、先頭から「分・時・日・月・曜日」の5つのフィールドと、それに続く「実行するコマンド」で構成されます。つまり区切りの空白で6つの部分に分かれ、最初の5つが「いつ動かすか」を、6つ目以降が「何を動かすか」を表します。たとえば 0 3 * * * /usr/local/bin/backup.sh という1行は、左の5フィールドが「毎日午前3時0分」というタイミングを、右の部分が「そのときに backup.sh を実行する」ことを意味します。この5フィールド方式(cron式)が読み書きできるようになると、定期実行のタイミング設計はほぼここで完結します。逆にここがあいまいだと、狙った時刻と実際の実行がずれて悩むことになるので、最初にしっかり固めておきたい土台です。

5つのフィールドと取りうる値

5つのフィールドが受け付ける値の範囲は決まっています。第1フィールドは分で 0 から 59、第2フィールドは時で 0 から 23(24時間制)、第3フィールドは日で 1 から 31、第4フィールドは月で 1 から 12、第5フィールドは曜日で 0 から 7 です。曜日は少し特殊で、0 と 7 のどちらも日曜を表し、1が月曜、2が火曜、…、6が土曜となります。月や曜日は jan・feb… や sun・mon… といった英語の3文字略称でも書けますが、数字で統一しておくほうが読み違いが減ります。順番を「分・時・日・月・曜日」と暗記しておくことが、書き間違いを防ぐ第一歩です。とくに先頭が「時」ではなく「分」から始まる点を取り違えると、たとえば「3時に動かすつもり」が「毎時3分に動く」ことになり、時刻がまるごとずれてしまいます。慣れるまでは、書いた式を左から「分が…、時が…」と声に出して読み返す癖をつけると安全です。

値の書き方 — アスタリスク・範囲・列挙・刻み

各フィールドには、単なる数字以外にいくつかの記法が使えます。まず * (アスタリスク)は「そのフィールドのすべての値」、平たく言えば「毎」を意味します。* * * * * は「毎分」です。次に - を使った範囲指定があり、たとえば時フィールドの 9-17 は「9時から17時まで」を表します。, を使えば列挙でき、分フィールドの 0,30 は「0分と30分」、つまり毎時0分と30分の2回です。そして / を使った刻み(ステップ)指定が便利で、*/5 は「5おきに」を意味します。分フィールドの */5 なら5分おき、*/10 なら10分おきです。範囲と刻みは 0-30/10 のように組み合わせることもでき、これは「0分から30分の間で10分おき(0分・10分・20分・30分)」を表します。これらを複数フィールドにまたがって使えば、たとえば「平日の9時から18時まで30分おき」のような細かいスケジュールも 0,30 9-18 * * 1-5 と表現できます。

具体例で読む

いくつか代表的な例を、左から順に声に出して読む練習をしておくと身につきます。0 3 * * * は「分が0、時が3、日・月・曜日は毎」なので毎日午前3時0分。*/10 * * * * は「10分おき、時・日・月・曜日は毎」なので10分おきにずっと。30 2 * * 0 は「2時30分、曜日が0=日曜」なので毎週日曜の午前2時30分。0 9 1 * * は「9時0分、日が1」なので毎月1日の午前9時。0 0 * * 1-5 は「0時0分、曜日が1-5=月〜金」なので平日の毎晩深夜0時、という具合です。45 23 * * 6 なら毎週土曜の23時45分、0 */6 * * * なら6時間おき(0時・6時・12時・18時)です。読むときは必ず左端の分から順にたどるのがコツで、これに慣れると、初めて見る式でもその場で意味を解釈できるようになります。書いた後は crontab -l で登録内容を見直し、date で現在時刻を確かめながら、最初はわざと短い間隔でテストして動作を確認してから、本番の間隔に直すと失敗が減ります。

よくある落とし穴 — 日と曜日の関係

crontab の書式で最も誤解されやすいのが、第3フィールド(日)と第5フィールド(曜日)の関係です。直感では「日と曜日の両方を満たしたときだけ実行」と思いがちですが、cron の仕様では、日と曜日の双方が * 以外で指定されている場合、どちらか一方が一致すれば実行されます(AND ではなく OR 条件)。たとえば 0 0 13 * 5 は「毎月13日」または「毎週金曜」のどちらかに当てはまる日すべてに動き、「13日の金曜だけ」にはなりません。意図せず想定の何倍も動いてしまう、よくある事故の元です。13日の金曜だけを狙うようなケースは素の cron では正しく書けず、毎週金曜に起動したうえでスクリプト側で if [ "$(date +%d)" = "13" ] のように日付を確認して処理を分岐する、といった工夫が必要になります。逆に、日と曜日のどちらかを * にしておけば、この OR の罠にはかかりません。

もう1つの罠 — % 記号とスクリプト化

もう1つの定番のはまりどころが % 記号です。crontab のコマンド部分では、エスケープしない % が「改行」として特別扱いされ、最初の % より前がコマンド、後ろがそのコマンドへの標準入力として渡されます。そのため date +%Y%m%d のように % を含むコマンドをそのまま書くと意図どおり動きません。バックスラッシュで \% とエスケープするか、処理をスクリプトファイルにまとめてそのスクリプトを呼ぶ形にすれば回避できます。実務では後者、つまり複雑な処理や % を含む処理はスクリプト化し、crontab からは 0 3 * * * /usr/local/bin/backup.sh のように絶対パスで1行呼ぶだけ、という形がいちばん安全で読みやすくなります。書式そのものはこの項で押さえたとおりですが、「凝ったことは1行に詰め込まずスクリプトへ」という方針を併せて持っておくと、cron まわりのトラブルの多くを未然に防げます。

この項目に出てくる用語

cron式(5フィールド)クロンしき
「分 時 日 月 曜日」の5つで実行タイミングを表す cron の書式。
crontabクロンタブ
cron の予定表そのもの、またはそれを編集するコマンド。ユーザごとに持つ。

関連コマンド

crontabdate

▶ 学習アプリでこの続きを学ぶ・演習する