設定 - Cron
概要
crontabを設定する方法は下記の2種類が存在するので、それぞれの方法について記載する。
設定ファイル(crontabファイル)を読み込む方法は、誤って内容を削除することがないので推奨する。
- コマンドで設定(crontab -e)
- 設定ファイルを読み込む(crontabファイル)
以下のCronのフォーマットに従って、自動実行するコマンドまたはプログラムを記述する。
# Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) or (jan, feb, mar, apr, ...) # | | | | .---- day of week (1 - 7) (Sunday = 0, Monday = 1, ...) or (sun, mon, ...) # | | | | | # * * * * * username command-to-be-executed
Cronの仕組み
crontabファイルを編集してCronの設定を変更した場合、変更内容は即座に反映される。
LinuxおよびCronサービスの再起動は不要である。
Cronは、以下に示すような仕組みで動作する。
- Cronデーモンが常に動作しており、1分ごとにcrontabファイルを確認する。
- crontabファイルが変更されている場合、Cronデーモンはその内容を読み込み、新しいスケジュールに基づいてジョブを実行する。
- したがって、crontabファイルを保存した時点で、次の1分以内に新しい設定が有効になる。
ただし、以下の点に注意が必要である。
- crontabコマンドで編集を行った場合は自動的に認識されるが、直接crontabファイルを編集した場合は、編集後にCronデーモンにリロードを指示するためのコマンドの実行が推奨される。
sudo systemctl reload cron
- crontabファイルにシンタックスエラーがある場合、Cronデーモンはそのファイルを読み込まないため、編集内容が反映されない。
したがって、多くの場合は、Cronの設定変更は即座に反映されますが、確実を期すためには編集後に再読み込みを行うことが望ましいと言える。
特に、Cronにシンタックスエラーがあると反映されないため、設定後はジョブが意図通り動作するかどうかを確認する。
crontabの書式
ファイルを読み込んで編集
crontabの設定が記述されたファイルを読み込み、crontabの設定を行う。
こちらの方法では、誤って設定内容が全て削除されることが無いので、安心して設定変更を行うことが出来る。
crontab [-u ユーザ] -l > <ファイル名>
設定例
まず、-lオプションで現在の設定を表示して、リダイレクトでファイルに書き込み、ファイルをバックアップする。
次に、crontabにファイルを読み込ませる。(設定変更により問題が発生した場合は、以前の設定を戻すことが出来る)
以下に例を示す。
crontab -l > crontab-data cp -p crontab-data crontab-data_`date "+%Y%m%d-%H%M%S"` vi crontab-data crontab crontab-data
コマンドで設定 crontab -e
ユーザを指定しない場合、実行したユーザのcrontabが操作対象となる。
rootユーザの場合、-uオプションで指定したユーザのcrontabを設定したり、内容を確認することが出来る。
crontab [-u ユーザ] -e
設定例
以下の例は、毎時00分にtest.shスクリプトを実行させる設定である。
設定内容は、/var/spool/cron/<ユーザ名>ファイルに保存される。(パーミッションの関係で、rootユーザのみ内容を確認できる)
# 例 1 00 * * * * /usr/local/bin/test.sh
以下の例は、毎日6時15分にtest.shスクリプトを実行させる設定である。
# 例 2 15 6 * * * /home/<ユーザ名>/test.sh
オプション
crontabを操作する際によく使用されるオプションを記載する。
オプション | 説明 | コマンド実行例 |
---|---|---|
-u <ユーザ名> | ユーザを指定してcrontabを実行する。(rootユーザのみ使用可能) 省略した場合、crontabコマンドを実行したユーザで設定される。 |
crontab -u <ユーザ名> -l
|
-l | crontabの設定内容を表示する。 | crontab -l
|
-e | crontabの設定を行う。 設定を削除する[r]キーと隣り合わせなので注意すること。 |
crontab -e
|
-r | crontabの設定を削除する。 削除の確認メッセージは無く、全ての設定が削除されるので注意すること。 |
crontab -r
|
-i | -rオプションと一緒に使用するとき、設定削除の確認メッセージが表示がされ、[y]または[Y]キーを押下することで設定が削除される。 | crontab -ir
|
注意事項
間違ってcrotab -rをしないためには、-iオプションを.bashrcファイルにエイリアスとして設定することで、-rオプションで設定を削除する際に確認を表示させる。
vi ~/.bashrc # .bashrcファイル alias crontab='crontab -i'
スケジュールの書式
crontabで設定するスケジュールの書式は下記の通りであり、空白またはタブで区切られた5つのフィールドで構成される。
フィールドは左から、分・時・日・月・曜日を指定することができる。
※システム上で設定する/etc/crontabファイルや/etc/cron.dディレクトリ内の設定ファイルの記述方法は、下記の書式とは異なる。(実行ユーザを指定する項目が増える)
* * * * * [実行コマンド]
各フィールドで設定可能な数値
分・時・日・月・曜日のフィールドに指定できる数値は下記の通りであり、リスト、範囲、間隔といった設定方法と組み合わせてスケジュールを設定する。
設定項目 | 数値 |
---|---|
分 | 0 - 59 |
時 | 0 - 23 |
日 | 1 - 31 |
月 | 1 - 12 |
週 | 0-7 (0または7は日曜日) 0=日、1=月、2=火、3=水、4=木、5=金、6=土、7=日 |
*は全ての値となる
スケジュールの設定は数値以外にも、アスタリスク*が設定できる。
アスタリスク*は、各項目で設定できる全ての値を設定していることになる。
例えば、下記の設定では毎分コマンドが実行される。
* * * * * [実行コマンド]
スケジュール指定方法
スケジュールの設定は、下記の指定方法を使用することで、より柔軟に実行する時間を設定することが出来る。
リストや範囲を併せて指定することも可能であり、時間フィールドで「1,6,9-11」と指定した場合、1時、6時、9時、10時、11時に処理を実行する。
指定方法 | 設定例 | 説明 |
---|---|---|
リスト指定 | 0,10,20,30 | カンマで区切ることで複数指定ができる。 分フィールド指定した場合は、0,10,20,30分に実行する。 |
範囲指定 | 1-5 | ハイフンで範囲指定ができる。 月フィールドで指定した場合は、1,2,3,4,5月に処理を実行する。 |
間隔指定 | */10 | "*/数値"で間隔を設定することができる。 分フィールドで指定した場合は、10分間隔で処理を実行する。 /の後ろに指定した値の間隔で処理を実行する。 |
スケジュールの設定例
下記に、crontabでのスケジュールの設定例を示す。
分単位の設定例
毎時15分になると実行する。
15 * * * * 実行コマンド
時間単位の設定例
毎日AM 4:02 に実行する。
02 4 * * * 実行コマンド
日にち単位の設定
毎月10日のAM 6:15 に実行する。
15 6 10 * * 実行コマンド
月単位の設定
7月1日 AM 3:00に実行する。
00 3 1 7 * 実行コマンド
曜日単位の設定
毎週月曜日のAM 10:00に実行する。
日:0 or 7、月:1、火:2、水:3、木:4、金:5、土:6
00 10 * * 1 実行コマンド
書式応用設定
リスト指定、範囲指定、間隔指定の設定例である。
リスト設定
カンマで区切ることで、複数の値を設定することが出来る。
毎日AM 4:30とAM 9:30に実行する。
30 4,9 * * * 実行コマンド
毎週月、金曜日のAM 3:00に実行する。
00 3 * * 1,5 実行コマンド
範囲設定
-で指定することで、実行範囲を指定することが出来る。
毎日AM 3:00 4:00 5:00 6:00 7:00 9:00 に実行する。
00 3-9 * * * 実行コマンド
毎月10日のAM 3:15 4:15 5:15 6:15 に実行する。
15 3-6 10 * * 実行コマンド
間隔設定
/の後に実行したい間隔の値を設定することで、その間隔で実行することが出来る。
10分ごとに実行する場合
*/10 * * * *
3時間ごとに実行する場合
00 0-23/3 * * * 実行コマンド
複合
リストや範囲をあわせた記述も出来る。
AM 1:00 6:00 9:00 10:00 11:00に実行する。
00 1,6,9-11 * * * 実行コマンド
crontabのTips
cronで月末を指定
cron(crontab)で月末で指定する方法
毎月28~31日の間に「test」コマンドで月末かどうかを判定する。
$( date --date '+1 day' +\%d ) # 1日後は何日かを求めて変数へ格納する
または、testコマンドで1日後が1日であれば(-eq 1)、月末あると判定する。
55 23 28-31 * * /usr/bin/test $( date --date '+1 day' +\%d ) -eq 1 && 実行コマンド
最終金曜日のみ実行
毎週金曜日にtestコマンドで最終金曜日の判定を行う。
0 0 * * 5 # 金曜日の0時0分をスケジュール $( date +\%m ) # 今日は何月かを求めて変数に格納する $( date --date '7 day' +\%m ) # 7日後は何月かを求めて変数に格納する
当日の月と7日後が何月なのかをtestコマンドで比較して、値が異なる(-ne)場合は、最終金曜日であると判断する。
金曜日以外の判定を行いたい場合は、曜日を指定するフィールドを適宜変更する。
0 0 * * 5 /usr/bin/test $( date +\%m ) -ne $( date --date '7 day' +\%m ) && 実行コマンド'
メールを送信しない場合
cron実行後の結果をメールで送信させない場合は、cron設定の前に以下の行を入力することで、メールが送信されなくなる。
複数のアドレスにメールを送信する時は、カンマ区切りで複数メールアドレスを指定する。($MAILTO変数は、デフォルトのメールアドレスを上書きする)
MAILTO=""
特定のスケジュールのみメールの宛先を変更する場合は、次のように指定する。
crontab -e 0 2 * * * 実行コマンド 2>&1 | Mail [送信先メールアドレス]
再起動時に実行する
@rebootと指定することで、再起動時に何かの処理を実行することが出来る。
@reboot 実行コマンド
サーバ起動後に任意の時間経過後に実行する
sleepコマンドと組み合わせる。
その他の方法としては、実行する処理をシェルスクリプト等で作成して、最初にsleepコマンドで実行を待機する方法もある。
@reboot sleep 600; 実行コマンド
秒単位の設定
crontabの標準の設定では、秒単位での指定はできないが、下記のように記述すると秒単位で実行することが出来る。
毎分10秒にコマンドを実行する。
* * * * * sleep 10; 実行コマンド
毎分30秒にコマンドを実行する。
* * * * * sleep 30; 実行コマンド
決まった秒数の間隔で実行する。この方法は、sleepコマンドで待機させる時間をずらして、複数行に分けて記述する。
ただし、この方法では、1秒ごとにコマンドを実行させたい場合、60行記述する必要があるので非推奨である。
* * * * * 実行コマンド * * * * * sleep 10; 実行コマンド * * * * * sleep 20; 実行コマンド * * * * * sleep 30; 実行コマンド * * * * * sleep 40; 実行コマンド * * * * * sleep 50; 実行コマンド
for文を使用
for文を使用することで、1行で秒指定を行うことが出来る。
<秒間隔>の部分にsleepさせたい秒数を設定する。
* * * * * for i in `seq 0 <秒間隔> 59`;do (sleep ${i} ; 実行コマンド) & done;
例えば、10秒毎に実行する場合は、下記の通りになる。
* * * * * for i in `seq 0 10 59`;do (sleep ${i} ; 実行コマンド) & done;