空行および行頭のスペース・タブは無視される。 行先頭の空白以外の文字が # の行はコメント行であり、無視される。 cron コマンドとしての行に注釈としてのコメントを入れることはできない。 それらはコマンドの一部とみなされてしまう。 同様に、環境変数を設定している行にコメントを入れることはできない。
crontab の動作行は、 環境変数の設定か cronコマンドのいずれかである。 環境変数の設定は以下の形式をとる:
name = value
ただし、等号 (=) 両側のスペースはなくても良い。 value 内部の (先頭ではない) スペース文字は、値の一部として name に与えられる。 value 文字列は引用符で括ってもよい (シングルクォートでもダブルクォートでも良いが、 揃っている必要がある)。 こうすれば先頭や末尾の空白を値に渡すことができる。
いくつかの環境変数は cron(8) デーモンによって自動的に設定される。 SHELL は /bin/sh に設定され、 LOGNAME とHOME は /etc/passwd の crontab の所有者の行から設定される。 HOME と SHELL は crontab 内部の記述で変更できる。 LOGNAME は変更できない。
(さらに注意:LOGNAME 変数は、 BSD システムではまれに USER と称される... これらのシステム上では USER も設定される。) LOGNAME, HOME, SHELL の他に、 cron(8) は「この」crontab を実行した結果メールを送る必要が生じた場合、 MAILTO も参照する。 もしMAILTOが定義されていたら (およびそれが空でなかったら) その名前のユーザーにメールを送る。 MAILTO が定義されていても値が設定されていなければ (MAILTO="")、 メールは送信されない。 MAILTO が定義もされていなければ、メールは crontab の所有者に送られる。 cron をインストールする際に、メーラーを /usr/lib/sendmail ではなく /bin/mail にしていると、このオプションは便利である。 /bin/mailはエイリアシングを行わないし、 UUCP はたいていこのメールを読まないからである。
cron コマンドの形式は V7 標準そのものであるが、 多くの上位互換な拡張がある。 各行には 5 つの時刻・日付フィールドがあり、 (システムの crontab ファイルの場合) ユーザー名が続き、 さらにコマンドが続く。 分・時・月が現在時刻と一致し、 かつ、 2 つの日フィールド (月内日または曜日) のいずれかが現在時刻と一致すれば (以下の「注意」を参照)、 コマンドが cron(8) によって実行される。 cron(8) は毎分に一度 cron エントリを調べる。 時間と日付フィールドは以下の通り:
フィールドにはアスタリスク (*) も指定できる。 これはあらゆるフィールドで ``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 環境変数で指定されたシェル) によって実行される。 コマンド中にパーセント記号 (%) が バックスラッシュ (\) によってエスケープされずに置かれていると、 改行文字に置き換えられ、最初に現れた % 以降の全てのデータは 標準入力としてコマンドに送られる。
注意: コマンド実行の日は 2 つのフィールドで指定できる ---
月内日および曜日である。
もし両方のフィールドが制限指定 (* 以外) であると、
いずれかのフィールドが現在時刻と合った時にコマンドが実行される。
例えば、
``30 4 1,15 * 5''
とすると、毎月 1 日と 15 日および毎週金曜日の
午前 4:30 にコマンドが実行される。
# (/etc/passwd の指定に関らず) コマンド実行に /bin/sh を使用する。 SHELL=/bin/sh # (この 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 分に実行する"
リストと範囲は同じフィールドに共存できる。 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 ではこれもできない)。
Paul Vixie <paul@vix.com>