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つの時間フィールドの代わりに、以下の省略文字列のいずれかを使用できます:
| String | Equivalent |
|---|---|
@yearly / @annually | 0 0 1 1 * |
@monthly | 0 0 1 * * |
@weekly | 0 0 * * 0 |
@daily / @midnight | 0 0 * * * |
@hourly | 0 * * * * |
@reboot | Run 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実用的な例
*/5 * * * *— run every 5 minutes0 0 * * *— run once a day at midnight0 9 * * 1-5— run at 9 AM on weekdays0 0 1 * *— run at midnight on the 1st of every month0 0 * * 0— run at midnight every Sunday