RealPath:
WebPath:
2017/01/19 14:33 (JST) 更新
時間関連 >>

crontab

Contents

サービス稼働状況

bash
# service crond status

ユーザ設定

編集

bash
crontab -e

確認

bash
crontab -l

書式

コメント

crontab
# コメント

crontab
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に実行
4-59/15 * * * *           4分、19分、34分、49分

特殊文字

クォーテーション利用は避けること

ダメな例

crontab
* * * * * echo hello >> test_`date '+%Y%m%d'`.log
* * * * * echo hello >> test_`date "+%Y%m%d"`.log

 
良い例

crontab
* * * * * echo hello >> test_`date +\%Y\%m\%d`.log
* * * * * echo hello >> test_$(date +\%Y\%m\%d).log

「%」を使用したい場合、「\%」と表記する

crontabで%(パーセント記号)を使うときは\でエスケープする - TIM Labs

crontabのコマンドを指定するフィールドで%を使うと、最初の%以降は標準入力に対する入力して解釈されます。%そのものを使いたい場合には(バックスラッシュ記号)でエスケープする必要があります。

環境変数の制御

ログインシェルと同じ環境変数で実行する

スクリプトを以下のように書くと環境変数がログイン時シェルと同じような感じに近づく(しかし完全に同じにはならない…)

hoge.sh
#!/bin/bash -l
....
....

PATH 設定など

crontab -e で開かれる crontab 設定の先頭で任意の環境変数を設定することができる。

設定例

crontab
PATH=/usr/local/bin

* * * * * /hoge/fuga.sh

応用

よく使う環境変数を一箇所のファイルでまとめておくと捗ることがある。

/etc/allenv (自作)
export PATH=/usr/local/bin:/bin:/usr/bin
. /etc/profile
. ~/.bash_profile
crontab
* * * * * . /etc/allenv; . /home/tokyo/batch/dox.sh

※「sh」や「bash」ではなく「.」で起動することで環境変数を引き継がせる。

/etc/cron.d ディレクトリの利用

/etc/cron.d に以下のようなファイル(ファイル名はたぶんなんでも良い)を設置すると指定時刻に指定ユーザで指定スクリプトが実行される。

/etc/cron.d/sample-file
* * * * * root /path_to_script.sh
* * * * * kobake /path_to_script.sh
* * * * * tokyo /path_to_script.sh

/etc/crontab

一応このファイルでも設定を行えるみたいだが RedHat 系では編集非推奨らしい。

利用例

パフォーマンス定期計測

crontab
0,10,20,30,40,50 * * * * cp -p /proc/meminfo /var/perf_log/meminfo_`date +\%Y\%m\%d\%H\%M`

時間のかかる処理

別に末尾に「&」とか付けなくて大丈夫です。

保存ファイル場所

crontab -e で編集した内容が保存される場所は以下。

  • /var/spool/cron/ユーザ名

トラブルシューティング

「BAD FILE MODE」エラー

「/var/spool/cron/ユーザ名」ファイルのパーミッションが 600 以外になっていると発生する。

「WRONG FILE OWNER」エラー

「/etc/cron.d」ディレクトリに設置されているファイルのオーナーが root 以外だとこのエラーが出る。

crontab で実行される実行ファイルが not found になる場合

crontab -e で編集できるファイルの先頭で PATH を設定。

crontab
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin

もしくは crontab 経由で実行される可能性のある実行ファイルパス指定はフルパスにしておく。

crontab で実行される svn が「Can't convert string」エラーを出す場合

エラー内容

svn: Error converting entry in directory 'bin/debug' to UTF-8
svn: Can't convert string from native encoding to 'UTF-8':

crontab -e で編集できるファイルの先頭で LANG を設定すると良い。

crontab
LANG=en_US.UTF-8
または
LANG=ja_JP.UTF-8

参考