Posted at

クーロン(cron)をさわってみるお

More than 3 years have passed since last update.


まずは確認してみよう

crondが起動しているかどうか確認

$ service crond status

//または
$ /etc/rc.d/init.d/crond status

以下が表示されたらOK。

crond (pid  1608) を実行中...


起動してない場合

service crond start

// または
/etc/rc.d/init.d/crond start


さっそく設定ファイルにcronの登録


登録

以下のコマンドでcronを登録・削除できる。

$ crontab -e


書き方

5分おきに/home/hoge/fuga.shを実行するという例

*/5 * * * * /home/hoge/fuga.sh

左から、[分] [時] [日] [月] [曜日] [コマンド]


  • 分は0~59の数字で指定

  • 時は0~23の数字で指定

  • 日は1~31の数字で指定

  • 月は1~12の数字で指定

  • 曜日に関しても数字で指定し、0と7が日曜日、1以降は順に、月、火、水、木、金、土となる

  • コマンドは、設定ファイルでパスを通していないものに関してはフルパスで指定するかカレントディレクトリからの相対パスで指定しなければならない


時間の書き方例

43 23 * * *               23:43に実行

12 05 * * *    05:12に実行
0 17 * * * 17:00に実行
0 17 * * 1 毎週月曜の 17:00に実行
0,10 17 * * 0,2,3 毎週日,火,水曜の 17:00と 17:10に実行
0-10 17 1 * * 毎月 1日の 17:00から17:10まで 1分毎に実行
0 0 1,15 * 1 毎月 1日と 15日と 月曜日の 0:00に実行
42 4 1 * *     毎月 1日の 4:42分に実行
0 21 * * 1-6   月曜日から土曜まで 21:00に実行
0,10,20,30,40,50 * * * * 10分おきに実行
*/10 * * * *        10分おきに実行
* 1 * * *         1:00から 1:59まで 1分おきに実行
0 1 * * *         1:00に実行
0 */1 * * *        毎時 0分に 1時間おきに実行
0 * * * *         毎時 0分に 1時間おきに実行
2 8-20/3 * * *      8:02,11:02,14:02,17:02,20:02に実行
30 5 1,15 * *       1日と 15日の 5:30に実行

※ちなみに全部 * だと毎分実行される。


登録されているcronを確認表示

以下のコマンドで確認

$ crontab -l

*/5 * * * * /home/hoge/fuga.sh


設定の全削除

以下のコマンドで設定全消去(要注意)

$ crontab -r


正しく動いているかどうか確認する方法

以下のファイルに実行結果が吐出されるので、確認すればOK。

# vi /var/log/cron


動いてない時に確認する事


crondは起動しているか?

$ service crond status

//または
$ /etc/rc.d/init.d/crond status


実行ファイルの権限は正しいか

シェルやPerlなどのファイルを実行する場合、ファイルに実行権のパーミッションの付与を忘れないようにする。


ファイルはフルパスで指定されているか

フルパス、または実行ファイルがあるディレクトリまでcdコマンドで移動し、相対パスでそのディレクトリを指定する。

00 * * * * cd /home/foo/public_html; ./foo.sh


TIPS


TIPS1: /etc/crontab

crontab -e を間違えて crontab -r とタイプしてcron消しちゃう事故がよくある。(-rはcrontabを消去するオプション。確認も求めずに綺麗に抹殺してくれる。rがキーボードのeの隣なので、油断してるとやらかす。)

/etc/crontab とか /etc/cron.d/ を使ったほうが良い。/etc/cron.d/だとファイルを分けられるので管理しやすくなる。ついでにタスク毎に実行ユーザーも指定できる。


/etc/crontab の書き方

ユーザー指定のパラメータ(user-name)が増えてる。/etc/cron.d/も同じ

# 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 (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed


TIPS2: cronの実行結果をメールする

環境変数 MAILTO を設定するとcronの標準出力がメールで送られてくる。

cronが動いてるかどうかが常に心配なお方向け。

# /etc/cron.d/backup

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
HOME=/
MAILTO="tektoh@gmail.com"
LANG=ja_JP.UTF-8
LC_ALL=ja_JP.UTF-8
CONTENT_TYPE=text/plain; charset=UTF-8

0 0 * * * root sh /usr/local/bin/backup.sh

LANG, LC_ALL, CONTENT_TYPE をちゃんと設定しないと文字化けするので注意。


補足

・行が増えてきたりして管理が大変

・crontab -rで消しちゃったりとかしたらまずい

ので、

gitで管理したり

http://newapps.hatenablog.com/entry/2013/09/02/172801

wheneverをいれたり

http://morizyun.github.io/blog/whenever-gem-rails-ruby-capistrano/

するといいらしい。