crontabの設定方法をすぐに忘れるのでメモ代わりにまとめています。
※最初にまとめてからかなり時間が経過したので、内容の精査とその間に勉強した項目を追加しました。
crontabを設定する方法
crontabを設定する方法には2通りの方法があるので説明をしていきます。
- crontab -e ※コマンドで設定
- crontab ファイル ※ファイルを読み込んで設定
「crontab -e」コマンドで設定
「crontab -e」コマンドを実行するとcronを設定する画面が表示されます。
「e」では無く、横にある「r」を誤って指定してしまうと、設定されているcronの内容が削除されてしまうので注意してください。
$ crontab -e
設定を編集する画面が表示されるので、下記のような書式で設定を行います。
00 * * * * /root/disk-space.sh
ちなみに、設定している内容は毎時00分に「disk-space.sh」というスクリプトを実行させる設定になります。
設定に使用されるエディターについて
設定を行う際のエディターはシステムに設定されているものか、環境変数のEDITORに設定されているものが使用されます。
環境変数EDITORの設定は下記の方法で確認することが出来ます。
echo $EDITOR
何も表示されない場合は設定が行われていないため、システムに設定されているエディターが使用されます。
「crontab ファイル」ファイルを読み込んで設定
「crontab」の設定が記述されたファイルを読み込ませることでも「crontab」の設定を行うことが出来ます。
ファイルを読み込んで設定を行うほうが「-r」と誤入力して設定内容が全削除されるといったこと事故が起きないので、安心して設定変更を行うことが出来ます。
crontab ファイル
実際に設定を行う場合は以下のような手順で設定を行うと良いでしょう。
- crontab -l > ファイル (現在の設定をファイルへ書き出す)
- ファイルをバックアップ
- ファイルを編集
- crontab ファイル (設定ファイルを読み込ませる)
この手順だと、設定の変更履歴も残りますし、設定に問題があった場合の切り戻しもバックアップからすぐに行うことが出来ます。
設定例
今回はcronの設定ファイル名をcrontab-dataとしていますが、ファイル名はお好きな名前でかまいません。
$ crontab -l > crontab-data $ cp -p crontab-data crontab-data_`date "+%Y%m%d-%H%M%S"` $ vi crontab-data $ crontab crontab-data
設定ファイルの保存場所
crontabで設定した内容は「/var/spool/cron/ユーザ」ファイルに保存されますが、パーミッションの関係でrootユーザでしか中身を確認することができません。
# ls -l /var/spool/cron/ 合計 8 -rw------- 1 root root 22 4月 2 11:39 root -rw------- 1 root tamo 20 4月 2 12:53 tamohiko
オプションの説明
「crontab」コマンドを実行する際に、普段使用しそうなオプションについて説明します。
オプション | 説明 |
---|---|
-u ユーザ名 | ユーザを指定してcrontabを実行(rootユーザのみ使用可) |
-l | 現在の設定内容を表示 |
-e | 設定を行う |
-r | 現在の設定を削除 |
-i | -rオプションと一緒に使用すると設定削除の確認メッセージが表示がされ、「y」か「Y」キーを押下することで設定が削除される |
-u ユーザの指定
どのユーザのcrontabを設定するのかを指定します。(rootユーザのみ使用可能)
# crontab -u tamohiko -l 1 * * * * echo "cron test"
省略した場合はcrontabコマンドを実行したユーザで設定されます。
-l 設定内容の表示
crontabの設定内容を標準出力へ表示させます。
$ crontab -l 1 * * * * echo test ### 設定内容が出力される
-e cronの設定
「-e」オプションを指定するとcronの設定を行うことが出来ます。
-r 設定を削除
crontabに設定されている内容を全て削除します。
削除の際は特に削除して良いかといった確認は無く、問答無用で全ての設定が削除されるので注意してください。
-i 削除時に確認(-rと組み合わせる必要あり)
「-r」オプションと一緒に使用することで、削除する前に確認のメッセージを表示冴えることが出来ます。
$ crontab -ri crontab: really delete tamohiko's crontab?
設定を削除したい場合は「y」また「Y」を入力する必要があります。
スケジュール(実行時間)設定書式
crontabで設定するスケジュール(実行時間)の設定書式は、空白またはタブで区切られた5つのフィールドで構成されています。
フィールドは左から「分」「時」「日」「月」「曜日」を指定することができます。
* * * * * [実行コマンド]
※システム上で設定する「/etc/crontab」「/etc/cron.d/」内の設定ファイルの書き方は、上記の書き方と若干書式が変わります。(実行ユーザを指定する項目が増えるぐらいです)
こちらのページでまとめていますので、時間があれば目を通してみてください。
各フィールドで設定可能な数値
「分」「時」「日」「月」「曜日」のフィールドに指定できる数値は下記のとおりとなっていて、それを「リスト(list)」「範囲(range)」「間隔(step)」といった設定方法と組み合わせてスケジュールを設定します。
設定項目 | 数値 |
---|---|
分 | 0-59 |
時 | 0-23 |
日 | 1-31 |
月 | 1-12 |
曜日 | 0-7 (0または7は日曜日) 0=日、1=月、2=火、3=水、4=木、5=金、6=土、7=日 |
「*」は全ての値となる
スケジュールの設定は数値以外にも「*」(アスタリスク)が設定できます。
「*」(アスタリスク)は各項目で設定できる全ての値を設定していることになります。
例えば下記の設定では毎分コマンドが実行されます。
* * * * * [実行コマンド]
スケジュール指定方法
スケジュールの設定は、下記の指定方法を使用することでより柔軟に実行する時間を設定することが出来ます。
指定方法 | 設定例 | 説明 |
---|---|---|
リスト指定(list) | 0,10,20,30 | 「,」で区切ることで複数指定が可能 分フィールド指定した場合は0,10,20,30分に実行します |
範囲指定(range) | 1-5 | 「-」で範囲指定が可能 月フィールドで指定した場合1,2,3,4,5月に処理を実行します |
間隔指定 | */10 | 「*/数値」で間隔を設定することが可能 分フィールドで指定した場合は10分間隔で処理を実行します 「/」の後ろに指定した値の間隔で処理を実行します。 |
「リスト」や「範囲」をあわせて指定することも可能で時間フィールドで「1,6,9-11」と指定した場合、1時、6時、9時、10時、11時に処理を実行します。
スケジュール設定例
crontabでのスケジュールの設定例を記述します。
分単位の設定例
毎時15分になると実行
15 * * * * 実行コマンド
時間単位の設定例
毎日AM 4:02 に実行
02 4 * * * 実行コマンド
日にち単位の設定
毎月10日のAM 6:15 に実行
15 6 10 * * 実行コマンド
月単位の設定
7月1日 AM 3:00に実行
00 3 1 7 * 実行コマンド
曜日単位の設定
設定可能な値 0-7
毎週月曜日のAM 10:00に実行
00 10 * * 1 実行コマンド
- 0 日
- 1 月
- 2 火
- 3 水
- 4 木
- 5 金
- 6 土
- 7 日
書式応用設定
「リスト指定」「範囲指定」「間隔指定」の設定例です。
リスト設定
「,」で区切ることで、複数の値を設定することが出来ます
設定例
毎日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 8: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
crontabで覚えておくと便利なことをメモしておきます。
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 && 実行コマンド
BSD系のdateコマンドの場合は--dateオプションの代わりに「-v+1d」(1日後)といったように設定する必要があります。
55 23 28-31 * * /usr/bin/test $( date -d -v+1d +\%d ) -eq 1 && 実行コマンド
最終金曜日のみ実行
情報元Blog::Rescueさま
毎週金曜日に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 ) && 実行コマンド'
BSD系のdateコマンドの場合は--dateオプションの代わりに「-v+7d」(7日後)といったように設定する必要があるそうです。
0 0 * * 5 /usr/bin/test $( date '+\%m' ) -ne $( date -v+7d '+\%m' ) && 実行コマンド
メールを出したくない場合
cron実行後の結果をメール送信させたくない場合は、cron設定の前に以下の行を入力することでメールが送信されなくなります。
MAILTO=""
複数のアドレスに飛ばしたいときは、カンマ区切りで複数メールアドレスを指定するとよいです。この$MAILTO変数は、デフォルトのメールアドレスを上書きします。
特定の設定のみ別のメールアドレスに送信したい場合
特定のスケジュールのみをメール送信の宛先を変更させたい場合には、次のように指定します。
# crontab -e 0 2 * * * 実行コマンド 2>&1 | Mail [送信先メールアドレス]
再起動時に実行させたい
「@reboot」と指定することで再起動時に何かの処理を実行させることが出来ます。
@reboot 実行コマンド
サーバ起動後に任意の時間経過後に実行させたい
この場合は「sleep」コマンドと組み合わせると幸せになれるでしょう。
@reboot sleep 600; 実行コマンド
その他の方法としては、実行させたい処理をシェルスクリプト等で作成して、最初に「sleep」コマンドで実行を待機させる方法もあります。
秒単位で設定
「crontab」の標準の設定では秒単位での指定はできませんが、一工夫すると秒単位で実行させることが出来ます。
毎分決まった秒数に実行
「sleep」コマンドで待機させる時間を設定することで、毎分決まった秒数にコマンド実行させることが出来ます。
例えば10秒毎にコマンドを実行させたい場合は下記のように設定します。
* * * * * sleep 10; 実行コマンド
30秒毎にコマンドを実行したい場合はこのように設定します。
* * * * * sleep 30; 実行コマンド
決まった秒数の間隔で実行
複数設定する力技
力技ですが「sleep」コマンドで待機させる時間をずらして複数行に分けて記述します。
* * * * * 実行コマンド * * * * * sleep 10; 実行コマンド * * * * * sleep 20; 実行コマンド * * * * * sleep 30; 実行コマンド * * * * * sleep 40; 実行コマンド * * * * * sleep 50; 実行コマンド
ただし、この方法では1秒ごとにコマンドを実行させたい場合60行書く必要があるのでとても大変です。
for文を使用
for文を使用して設定することで、一行で秒指定を行うことが出来ます。
間隔の部分にsleepさせたい秒数を設定してください。
* * * * * for i in `seq 0 間隔 59`;do (sleep ${i} ; 実行コマンド) & done;
例えば10秒毎に実行させたい場合は下記の通りになります。
* * * * * for i in `seq 0 10 59`;do (sleep ${i} ; 実行コマンド) & done;
間違ってcrotab -rをしないために!!
オプションの「-e」と「-r」はキーボードでは隣あわせなので、間違って押してしまって編集しようとして全部削除してしまったという悲惨事件が各地で発生している模様です・・・
そんな事態に陥らないようにするための一工夫です。
crontabには設定を削除する際に確認を行ってくれる「i」というオプションを「~/.bashrc」に「alias」として設定することで、「-r」で設定を削除する際に確認を表示させることができます。
$ vi ~/.bashrc
~/.bashrc編集内容
「crontab」コマンドを実行する場合に、自動的に「i」オプションが設定されるように「alias」の設定を行います。
alias crontab='crontab -i'
設定反映
設定が完了しましたら、「source」コマンドで「.bashrc」を読み込んで設定を反映させます。
$ source ~/.bashrc
動作確認
最初に現在の設定内容を「-l」を使ってファイルに書き出して、設定内容が正常に書き出されていることを確認します。
正常に設定が書き出されていることが確認できたら、「-r」オプションを指定して削除を行った際に削除を行って良いかの確認メッセージが表示されれば設定完了です。
$ crontab -l > ファイル $ cat ファイル $ crontab -r crontab: really delete tamohiko's crontab?
設定を削除する場合は「y」キーを入力、削除したくない場合は「n」キーを入力してください。
コメント