crontab(5) cron を駆動するための一覧表

説明

crontab ファイルには cron(8) デーモンへの命令が 「この日付のこの時刻にこのコマンドを使用せよ」 という形式で書き込まれている。 ユーザはそれぞれ自分用の crontab を持っており、 各 crontab に与えられたコマンドは、 その crontab を所有しているユーザの権限で実行されることになる。 UUCP や News はたいていそれぞれの crontab を持っているので、 cron コマンドの一部で su(1) を明示的に実行する必要性はない。

空行および行頭のスペース・タブは無視される。 行先頭の空白以外の文字が # の行はコメント行であり、無視される。 cron コマンドとしての行に注釈としてのコメントを入れることはできない。 それらはコマンドの一部とみなされてしまう。 同様に、環境変数を設定している行にコメントを入れることはできない。

crontab の動作行は、 環境変数の設定か cronコマンドのいずれかである。 環境変数の設定は以下の形式をとる:


    name = value

ただし、等号 (=) 両側のスペースはなくても良い。 value 内部の (先頭ではない) スペース文字は、値の一部として name に与えられる。 value 文字列は引用符で括ってもよい (シングルクォートでもダブルクォートでも良いが、 揃っている必要がある)。 こうすれば先頭や末尾の空白を値に渡すことができる。 value の文字列は、環境変数の置換のためにパースされることは ない 。したがって、


    PATH = $HOME/bin:$PATH

のような行は期待どおりの動作をしないだろう。

いくつかの環境変数は cron(8) デーモンによって自動的に設定される。 SHELL は /bin/sh に設定され、 LOGNAME とHOME は /etc/passwd の crontab の所有者の行から設定される。 PATH は "/usr/bin:/bin" に設定される。 HOME と SHELL、PATH は crontab 内部の記述で変更できる。 LOGNAME はジョブを実行しているユーザなので変更できない。

(さらに注意:LOGNAME 変数は、 BSD システムではまれに USER と称される... これらのシステム上では USER も設定される。) LOGNAME, HOME, SHELL の他に、 cron(8) は「この」crontab を実行した結果メールを送る必要が生じた場合、 MAILTO も参照する。 もしMAILTOが定義されていたら (およびそれが空でなかったら) その名前のユーザーにメールを送る。 MAILTO が定義されていても値が設定されていなければ (MAILTO="")、 メールは送信されない。 MAILTO が定義もされていなければ、メールは crontab の所有者に送られる。

Debian GNU/Linux システムでは、cron は pam_env モジュールをサポートしており、 /etc/security/pam_env.conf で指定された環境変数をロードする。 しかし PAM の設定は、前述の設定や crontab ファイル自体に書かれた設定を上書きでき ない 。特に、"/usr/bin:/bin" 以外の値を PATH に設定したい場合は、 その設定を crontab ファイル内で行う必要があることに注意せよ。

デフォルトでは、cron が送るメールの "Content-Type:" ヘッダの値には "text/plain" が使用され、その "charset=" パラメータには crond(8) を起動したロケールの文字マップやコードセットが設定される。 つまり、使用されるロケールは、 LC_* 環境変数が設定されていない場合はシステムのデフォルトのロケール、 そうでなければ LC_* 環境変数で指定されたロケールとなる ( locale(7) を参照)。 crontab ファイル内で、 変数 CONTENT_TYPE または CONTENT_TRANSFER_ENCODING の値に、 それらの名前をもつメールヘッダの値として適切な値を設定すれば、 メールされる cron ジョブの出力に異なる文字エンコーディングを使用できる。

cron コマンドの形式は V7 標準そのものであるが、 多くの上位互換な拡張がある。 各行には 5 つの時刻・日付フィールドがあり、 さらにコマンドと改行文字 ('\n') が続く。 システムの crontab ファイル (/etc/crontab) は同様のフォーマットを使用するが、 時刻・日付フィールドとコマンドの間で、 コマンドを実行するユーザ名を指定する。 フィールドはスペース区切りでもタブ区切りでもかまわない。

分・時・月が現在時刻と一致し、 かつ、 2 つの日フィールド (月内日または曜日) のいずれかが現在時刻と一致すれば (以下の「注意」を参照)、 コマンドが cron(8) によって実行される。 cron(8) は毎分に一度 cron エントリを調べる。 時間と日付フィールドは以下の通り:

フィールド 指定可能な値
---------- --------------
分 0-59
時 0-23
月内日 1-31
月 1-12 (もしくは名前。下記を参照)
曜日 0-7 (0 と 7 は日曜日。もしくは名前)

フィールドにはアスタリスク (*) も指定できる。 これはあらゆるフィールドで ``first-last'' という意味になる。

数値の範囲も指定できる。範囲は二つの数をハイフンでつなげる。 指定数値も領域に含まれる。例えば「時」に 8-11 を指定すると、 8時, 9時, 10時, 11時に実行することになる。

リストもできる。リストはコンマで区切られた数値 (または範囲) のセットである。 例:``1,2,5,9'', ``0-4,8-12''

間隔値を範囲とともに指定することもできる。 範囲の後に ``/<number>'' と指定すると、 範囲内で指定数値ずつ飛ばすことになる。 例えば「時」フィールドに ``0-23/2'' と指定すると、 コマンドは 2 時間おきに実行される (V7 標準の別形式で書けば ``0,2,4,6,8,10,12,14,16,18,20,22'') 間隔はアスタリスクの後にも指定できる。「2 時間おき」といいたければ ``*/2''とする。

「月」フィールドや「曜日」フィールドには名前を使用することもできる。 その日または月の最初の3文字を用いる (大文字小文字は問わない)。 範囲やリストを名前に対して用いることはできない。

「第 6」フィールド (行の残りの部分) には実行されるコマンドを指定する。 その行のコマンド部 (改行文字または % 文字まで) が /bin/sh (またはその crontab ファイルの SHELL 環境変数で指定されたシェル) によって実行される。 コマンド中にパーセント記号 (%) が バックスラッシュ (\) によってエスケープされずに置かれていると、 改行文字に置き換えられ、最初に現れた % 以降の全てのデータは 標準入力としてコマンドに送られる。 シェルの行末の "\" のような、 コマンドの単一の行を複数行に分割して記述する方法は、crontab にはない。

注意: コマンド実行の日は 2 つのフィールドで指定できる --- 月内日および曜日である。 もし両方のフィールドが制限指定 (* 以外) であると、 いずれかのフィールドが現在時刻と合った時にコマンドが実行される。 例えば、
``30 4 1,15 * 5''
とすると、毎月 1 日と 15 日および毎週金曜日の 午前 4:30 にコマンドが実行される。

最初の 5 つのフィールドの代わりに、 8 つの特殊な文字列のいずれか 1 つを指定してもかまわない:

文字列      意味

------        ----

@reboot       起動時に一度だけ実行。

@yearly       年に一度だけ実行 ("0 0 1 1 *" と等価)。

@annually     (@yearly と同様)

@monthly      月に一度だけ実行 ("0 0 1 * *" と等価)。

@weekly       週に一度だけ実行 ("0 0 * * 0" と等価)。

@daily        一日に一度だけ実行 ("0 0 * * *" と等価)。

@midnight     (@daily と同様)

@hourly       一時間に一度だけ実行 ("0 * * * *" と等価)。

CRON ファイルの例

# コマンドの実行に、デフォルトの /bin/sh ではなく /bin/bash を使用する。
SHELL=/bin/bash
# (この crontab の所有者に関らず) あらゆる出力を `paul' にメールする。
MAILTO=paul
#
# 毎日、日付変更の 5 分後に実行する
5 0 * * *       $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
# 毎月初日の 2:15pm に実行する -- 出力は paul にメールされる
15 14 1 * *     $HOME/bin/monthly
# 平日の午後 10 時に実行してジョーを心配させる
0 22 * * 1-5    mail -s "午後10時だ" joe%ジョー、%%お前の子どもはどこだい?%
23 0-23/2 * * * echo "毎日 0,2,4..時 23 分に実行する"
5 4 * * sun     echo "日曜 4 時 5 分に実行する"

システム CRON ファイルの例

システム CRON ファイルはユーザ名のフィールドを含み、 /etc/crontab によって使用される。
# /etc/crontab: システム規模の crontab
# 他の crontab ファイルとは異なり、このファイルを編集する際には、新し
# いバージョンをインストールするための `crontab' コマンドを実行する必
# 要はない。またこのファイルには、他の crontab ファイルのいずれにも含
# まれないユーザ名のフィールドが含まれる。
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user    command
42 6 * * *        root    run-parts --report /etc/cron.daily
47 6 * * 7        root    run-parts --report /etc/cron.weekly
52 6 1 * *        root    run-parts --report /etc/cron.monthly
#
# anacron の呼び出しは /etc/cron.d ファイルによって行われるようになっ
# たので、削除された。

拡張

曜日指定において、 0 も 7 も日曜日とみなされる。 BSD と ATT ではこのようにはなっていないようだ。

リストと範囲は同じフィールドに共存できる。 ATT や BSD の cron では "1-3,7-9" は拒否されるだろう -- "1-3" または "7,8,9" のいずれかだけしか指定できない。

範囲に「間隔値」を指定できる。すなわち "1-9/2" が "1,3,5,7,9" と同じ。

月または曜日を名前で指定できる。

環境変数を crontab の内部で設定できる。 BSD や ATT では、子プロセスに渡される環境は基本的に /etc/rc のものである。

コマンドの出力は crontab の所有者にメールされる (BSD ではこれを行わない)。 また crontab の所有者以外の人にもメールできる (SysV ではこれができない)。 さらにこの機能を無効にし、 誰にもメールを送らないようにもできる (SysV ではこれもできない)。

最初の 5 つのフィールドの代わりに指定できる `@' コマンドは全て拡張である。

著者

Paul Vixie <[email protected]>