Saba note

醜悪コード Ugly hacks ITものづくり

crontabの使い方

cronが設定されているかどうか確認する

$ crontab -l

で現在のcron設定が表示されます。cronはユーザー単位で設定されるので、スーパーユーザーの場合はrootがcronを設定することにまりますので注意。設定が初めての場合、または何もない場合は、「no crontab for <ユーザー名>」と言われます。

$ crontab -l
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/var/lib/gems/1.8/bin
RAILS_ENV=production

# m h dom mon dow command
*/30 * * * * perl /home/user/public_html/test.pl > /dev/null 2>&1

no crontab for <ユーザー名>」といわれた場合は、

$ crontab -e

で新しい設定をします。編集の方法はviやvimと同じです。本当に最初の場合はエディターの選択画面が現れます。

Select an editor. To change later, run 'select-editor'.
1. /bin/ed
2. /bin/nano <---- easiest
3. /usr/bin/vim.basic
4. /usr/bin/vim.tiny

Choose 1-4 [2]:

どれが一番使いやすいエディターかというのは一言で言えないものがありますので割愛しますが、前述の通り私自身はvimかviが慣れているのでそれを選択(3. /usr/bin/vim/basic)を選択しています。2のnanoは「最も簡単」みたいなことが書いてありますが使い方がわからない場合はもうどうしようもないです…。
もし間違ってエディタを選択してしまった場合は、

$ select-editor

で、再度エディタを選択できます。

$ update-alternatives --config editor

でもできました。OSによって違うのかな。(2015-01-06)

基本的な設定

# min hour day mth wday user command
*/10 * * * * php /home/user/write_stamp.php >/dev/null 2>&1

例のように一つのコマンドを一行で書きます。左から順番に

[分] [時] [日] [月] [曜日] [ユーザー] [コマンド]

となっています。各項目はスペースやタブで区切ります。この例では10分おきにphpファイルを実行します。またcrontabで編集した場合はそのユーザーが実行ユーザーとなるのでユーザーの設定を省略できます。(crontabはユーザーごとに設定されるからです。)コマンドの実行は端末などで実行する際の文法をそのまま書けばOKですが、最後に>/dev/null 2>&1でもってエラーなどをnullディバイスに捨ててやります。Ubuntuの場合これがないとうまく実行されない場合があるみたいです。
#はコメントアウトとして使えます。メモ書きなどにどうぞ。

設定例

33 14 * * * 14:33に実行(毎日)
15 06 * * *    6:15に実行(毎日)
0 16 * * * 16:00に実行(毎日)
0 04 * * 1 (月)の午前4:00に実行(毎週)
0,10 19 * * 0,2,3 (日)(火)(水)の19:00と19:10に実行(毎週)
0-10 14 1 * * 1日の14:00から14:10まで1分ごとに実行(毎月)
0 0 1,15 * 1 1日と15日と(月)の 0:00に実行(毎月)
42 4 25 * *    25日の4:42に実行(毎月)
0 21 * * 1-6   (月)〜(土)まで21:00に実行(日曜を除く)
0,10,20,30,40,50 * * * * 10分おきに実行(毎時)
*/10 * * * *        10分おきに実行(毎時)
* 1 * * *         1:00から1:59まで1分おきに実行(毎日)
0 4 * * *         4:00に実行(毎日)
0 */1 * * *        0分に1時間おきに実行(毎時)
0 * * * *         0分に1時間おきに実行(毎時)
2 8-20/3 * * *      8:02,11:02,14:02,17:02,20:02に実行(8:00から20:00まで3時間おきに実行)
30 5 1,15 * *       1日と15日の5:30に実行

cronがうまく実行されない場合

cronは通常のデーモンと同様に起動、停止、再起動することができます。デフォルトでは起動している筈ですが何かの拍子に停止しているのかもしれません。以下のコマンドでステイタス(状況)を確かめます。

# /etc/init.d/cron staus
Rather than invoking init scripts through /etc/init.d, use the service(8)
utility, e.g. service cron status

Since the script you are attempting to invoke has been converted to an
Upstart job, you may also use the status(8) utility, e.g. status cron
cron start/running, process 1236

プロセスの番号が振られて実行中であることがわかります。通常他のOSではcrond(デーモン)ってことになっているのですが、Ubuntuの場合はcronなので注意です。
停止している場合は、

# /etc/init.d/cron start

また、起動はしているけど働きがかんばしくない場合は、

# /etc/init.d/cron restart

起動しているかどうかは以下のコマンドでも確認できます。

# ps aux ¦ grep cron
root 1236 0.0 0.0 2088 812 ? Ss Jan12 0:00 cron
root 12938 0.0 0.0 2804 816 pts/2 S+ 23:49 0:00 grep cron

同様のプロセス番号が表示されます。

ログの確認

cronに関係するログは/var/log/syslogに書き込まれます。cronが正しく実行されていると以下のような記述がある筈です。cronの実行時間と比較してみてください。(Ubuntuには、/var/log/cronというファイルがありません。)

Jan 16 21:10:01 lily CRON[4062]: (user) CMD (php /home/user/write_stamp.php >/dev/null 2>&1)

cron設定の文法を確認

crontab設定の文法や実行するスクリプトの文法を確認します。crontabの書き方に間違いがなければスクリプト自体に問題があるかもしれないので何かエラーが出ていないか以下のようにエラーログをとってみるなどして確認します。

*/10 * * * * php /home/user/write_stamp.php > /home/user/cron_error.txt

crontabにテキストから読み込ませる

crrontabには-eオプションを使わないで、テキストにcronの内容を編集してから読み込ませることができます。

# m h dom mon dow command
*/30 * * * * perl /home/user/public_html/test.pl > /dev/null 2>&1

をcron.txtというファイルに保存します。

# crontab cron.txt

を実行してcrontabに読み込ませます。コマンド自体に間違いがある場合はこの時点でエラーが出ます。正常に読み込まれた場合はcrontab -lできちんと書き込まれているか確認できます。
フルパスで実行してみる
どうしてもうまくいかない場合は、コマンドをフルパスで実行してみます。

# m h dom mon dow command
*/30 * * * * /usr/bin/perl /home/user/public_html/test.pl > /dev/null 2>&1

実行するスクリプトをwhichコマンドなどで調べてフルパスで指定してみます。

ログの設定方法

/var/log/cron.logというログは場合によってはデフォルトで有効になっていないみたいです。(Ubuntuでは有効になってませんが、Debianはどうだったかな…と。)cron使うのだったら有効にしておいた方が無難です。

[ /etc/syslog.conf ]
#cron.* /var/log/cron.log

という部分のコメントアウトを外します。それからsysklogd(ログのデーモン)を再起動させます。

# /etc/init.d/sysklogd restart

そもそもcronがない
そもそもcrontabを実行するとコマンドがないといわれることがあります。

bash: crontab: command not found

そういう時はyumでインストールします。crontab(s)と複数形になっているのでご注意。

# yum -y install crontabs

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です