server-memo.net

crontabの書き方

      2016/01/22

crontabの書き方

検証環境

OS CentOS 4.4

crontabについて

設定した時間になったら定期的にコマンドを実行してくれる、ナイスガイですw
設定方法をすぐに忘れるのでメモ代わりに:-p

設定方法

crontab 書式

crontab [ -u ユーザ名 ] { -l | -r | -e }
オプションの使い方

-u オプション

-u どのユーザがcrontabを設定するのかを指定します。省略した場合はcrontabコマンドを実行したユーザで設定されます。

# crontab -u tamo -l
1 * * * * echo "cron test"

-l オプション

-l オプションは、現在の crontab を標準出力へ表示させる。

$ crontab -l
1 * * * * echo test

-r オプション

-r オプションは、現在の crontab を削除する。(全ての設定が削除されるので、使用は十分に注意してください)

-e オプション

-e オプションは、環境変数 VISUAL もしくは EDITOR で指定されているエディターを使って、現在の crontab を編集するのに使われる。編集終了後、 変 更された crontab は自動的にインストールされる。

設定書式

設定項目は左から「分」「時」「日」「月」「曜日」となっている。

* * * * * [実行コマンド]

※システム上で設定する「/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=日
実行時間指定方法
指定方法 設定例 説明
リスト 0,10,20,30 分フィールド指定した場合は0,10,20,30分に実行します。
範囲 1-5 月フィールドで指定した場合、1,2,3,4,5月に処理を実行します。
共存 1,6,9-11 時間フィールドで指定した場合、1時、6時、9時、10時、11時に処理を実行します。
間隔 */10 分フィールドで指定した場合、10分間隔で処理を実行します。「/」の後ろに指定した値の間隔で処理を実行します。

書式基本設定

cronでの実行時刻の設定例を記述します。

分単位の設定例

設定できる値 0-59

設定例

毎時15分になると実行

15  *  *  *  *

時間単位の設定例

設定できる値 0-23

設定例

毎日AM 4:02 に実行

02  4  *  *  *

日にち単位の設定

設定できる値 1-31

設定例

毎月10日のAM 6:15 に実行

15  6  10  *  *

月単位の設定

設定できる値 1-12

設定例

7月1日 AM 3:00に実行

00  3  1  7  *

曜日単位の設定

設定可能な値 0-7

各値に対応する曜日
月曜日    1
火曜日    2
水曜日    3
木曜日    4
金曜日    5
土曜日    6
日曜日    7 または 0
設定例

毎週月曜日のAM 10:00に実行

00  10  *  *  1

書式応用設定

基本の設定のみでは対応できない場合には、以下の方法で対応できるかもしれません。

間隔設定

「/」の後に実行したい間隔の値を設定することで、その間隔で実行することができます。

設定例

10分ごとに実行する場合

*/10  *  *  *  *

3時間ごとに実行する場合

00  0-23/3  *  *  *

リスト設定

「,」で区切ることで、複数の値を設定することが出来ます

設定例

毎日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  *  *

複合

リストや範囲をあわせた記述も可能です。

設定例

AM 1:00 6:00 9:00 10:00 11:00に実行

00  1,6,9-11  *  *  *

設定例

「crontab -e」コマンドでcronの設定を行います。

$ crontab -e
no crontab for tamo - using an empty one
crontab: installing new crontab

毎時00分に「disk-space.sh」というスクリプトを実行させる設定です。

00 * * * * /root/disk-space.sh

設定内容は/var/spool/cron/[user]に保存されますが、パーミッションの関係で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 tamo

crontabのTips

cronで月末を指定

情報元cron(crontab)で月末で指定する方法 ぎじゅっやさんさま

毎月28~31日の間にtestコマンドで月末かどうかをチェックしているようです。うーん、素晴らしいですね~:-)

55 23 28-31 * * /usr/bin/test $( date -d '+1 day' +%d ) -eq 1 && 実行したいコマンド

最終金曜日のみ実行

情報元Blog::Rescueさま

cron的には毎週金曜日testコマンドで判別をしている、最終金曜日の判定はtestコマンドにて行っています。賢いですねぇ~

0 0 * * 5 /usr/bin/test $( date '+\%m' ) -ne $( date -v+7d '+\%m' ) && echo 'Go Ahead!'

dateコマンドの種類によっては下記のように設定する必要があるそうです。

0 0 * * 5 /usr/bin/test $( date +\%m ) -ne $( date --date '7 day' +\%m ) && echo 'Go Ahead!'

間違ってcrotab -rをしないために!!

eとrは隣あわせなので、間違って押してしまって編集しようとして全部削除してしまったという悲惨事件が各地で発生している模様です・・・そんな事態に陥らないようにするために

aliasを設定する。(-iオプションがあればですが)

usage:  crontab [-u user] file
        crontab [-u user] [ -e | -l | -r ]
                (default operation is replace, per 1003.2)
        -e      (edit user's crontab)
        -l      (list user's crontab)
        -r      (delete user's crontab)
        -i      (prompt before deleting user's crontab)

~/.bashrcに設定する。

alias crontab='crontab -i' とする。

$ source ~/.bashrc
$ crontab -r
crontab: really delete tamo's crontab? n

メールを出したくない場合

cron設定の前に以下の行を入力

MAILTO=""

これでメールは飛ばなくなります。逆に、複数のアドレスに飛ばしたいときは、カンマ区切りで複数メールアドレスを指定するとよいです。この$MAILTO変数は、デフォルトのメールアドレスを上書きします。

特定の設定のみメールを変更

ただし、上記は/etc/crontab自体を変更した場合と同じく、実行するアカウントのcron設定すべての宛先に反映される。特定のスケジュールのみを宛先変更させたい場合には、次のように指定すればよい。

# crontab -e

0 2 * * * /bin/sh /etc/hogehoge 2>&1 | Mail [送信先メールアドレス]

以上。

 - Tips