crontab.run

Crontab コマンドの説明

Cron デーモン(crond)は Unix 系オペレーティングシステム上のバックグラウンドサービスで、スケジュールされたコマンドを実行します。crontab(cron テーブル)ファイルから設定を読み取り、各コマンドの実行時期と頻度を定義します。

構文

crontab コマンドはユーザーごとの crontab ファイルを管理します:

crontab [-u user] [-l | -r | -e | -i] [file]

オプション

-e
デフォルトエディター($VISUAL または $EDITOR)で現在のユーザーの crontab を編集します。エディター終了後に新しい crontab がインストールされます。
-l
現在のユーザーの crontab を標準出力に表示します。
-r
現在のユーザーの crontab を完全に削除します。
-i
削除前に確認を求めます(-r と併用)。
-u user
自分の crontab ではなく、指定したユーザーの crontab を操作します。root 権限が必要です。
file
指定されたファイルから crontab をインストールします。標準入力の場合は - を使用します。

Crontab ファイル形式

crontab ファイルの各行は、環境変数の代入、コメント(# で始まる)、または以下の形式の cron ジョブのいずれかです:

┌───────────── 分 (0–59)
│ ┌───────────── 時 (0–23)
│ │ ┌───────────── 日 (1–31)
│ │ │ ┌───────────── 月 (1–12 または JAN–DEC)
│ │ │ │ ┌───────────── 曜日 (0–6 または SUN–SAT)
│ │ │ │ │
* * * * *  実行するコマンド

フィールド演算子

* (asterisk)
そのフィールドのすべての値に一致します。
, (comma)
値のリストを指定します。例:日フィールドの 1,15 は1日と15日を意味します。
- (hyphen)
包含範囲を定義します。例:時フィールドの 9-17 は9時から17時までの毎時を意味します。
/ (slash)
ステップを定義します。例:分フィールドの */10 は10分ごとを意味します。範囲と組み合わせることもできます:1-30/5。

特殊文字列

5つの時間フィールドの代わりに、以下の省略文字列のいずれかを使用できます:

StringEquivalent
@yearly / @annually0 0 1 1 *
@monthly0 0 1 * *
@weekly0 0 * * 0
@daily / @midnight0 0 * * *
@hourly0 * * * *
@rebootRun once at startup

環境変数

crontab ファイルの先頭で環境変数を設定できます。最も一般的なもの:

SHELL
コマンドの実行に使用されるシェル(デフォルト:/bin/sh)。
PATH
コマンドの検索パス。Cron のデフォルト PATH は最小限(通常 /usr/bin:/bin)のため、常に絶対パスを使用するか PATH を明示的に設定してください。
MAILTO
コマンド出力の送信先。"" に設定するとメール送信を抑制します。デフォルトでは、出力は crontab の所有者にメールで送信されます。
CRON_TZ
crontab のタイムゾーンを設定します(すべてのシステムでサポートされているわけではありません)。設定しない場合、cron はシステムのタイムゾーンを使用します。
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
[email protected]

*/5 * * * * /home/user/scripts/backup.sh

システム crontab とユーザー crontab

ユーザー crontab(crontab -e で編集)は5つの時間フィールドとコマンドで構成されます。システム crontab(/etc/crontab)と /etc/cron.d/ 内のファイルは、時間フィールドとコマンドの間にコマンドを実行するユーザー名という追加フィールドがあります。

システム crontab の例:

# /etc/crontab
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m  h  dom mon dow user    command
*/15 *  *   *   *   root    /usr/local/bin/system-check.sh
0    2  *   *   *   backup  /usr/local/bin/nightly-backup.sh

よくある落とし穴

% (percent sign)

パーセント記号(%)は crontab で特別な意味を持ちます:改行に変換され、最初の % 以降のすべてがコマンドの標準入力として送信されます。リテラルの % を使用するには \% とエスケープしてください。

# Wrong — the % will be interpreted
0 0 * * * echo "Date: $(date +%Y-%m-%d)"

# Correct — escape the %
0 0 * * * echo "Date: $(date +\%Y-\%m-\%d)"

PATH

Cron は最小限の PATH で実行されます。/usr/local/bin やその他のディレクトリのコマンドに依存するスクリプトは、絶対パスを使用するか crontab の先頭で PATH を設定してください。

Day-of-month + day-of-week

日(day-of-month)と曜日(day-of-week)の両方が制限されている場合(* でない場合)、cron はいずれかのフィールドが一致した時にコマンドを実行します(OR 論理)。例えば、0 0 1 * 5 は毎月1日の深夜0時と毎週金曜日に実行されます。

Timezone

Cron はデフォルトでシステムのタイムゾーンを使用します。サーバーが UTC でもローカルタイムゾーンでジョブを実行したい場合は、CRON_TZ(サポートされている場合)を使用するか手動で時間を変換してください。

Output and logging

デフォルトでは、cron はすべての出力(stdout と stderr)を crontab の所有者にメールで送信します。ジョブを無音にするには、出力をリダイレクトします:command > /dev/null 2>&1。出力をログに記録するにはファイルにリダイレクト:command >> /var/log/myjob.log 2>&1。

# Discard all output
*/5 * * * * /path/to/script.sh > /dev/null 2>&1

# Log output to a file
*/5 * * * * /path/to/script.sh >> /var/log/myscript.log 2>&1

実用的な例