ナクナイ

勉強用の備忘録

cron が実行されない

手動でスクリプトを実行したときは問題なく動いたのに、crontab に設定するとなぜか動かないことってよくある。そんなときの備忘。

実行されているかどうか

まずはスクリプト内でエラーになっているのか、cron 自体が実行されていないのかの見極める。cron が実行されたり、crontab コマンドを発行したりすると、/var/log/cron にそのログが出力される。実行されるべき時間になってもログが出力されないようなら、下記コマンドを発行し、crond が動いているか確認する。

まずはプロセスの存在チェック

$ ps aux | grep cron
root      3028  0.0  0.0  74876  1168 ?        Ss    2014   0:00 crond
root     21887  0.0  0.0   6024   608 pts/3    S+   17:43   0:00 grep cron

もしくは

$ /etc/rc.d/init.d/crond status 
crond (pid  xxxx) を実行中...


つぎにプロセスの状態チェック

ランレベル 2 ~ 5 が ON になっているか確認 (参考:cron の設定ガイド)

$ chkconfig --list crond 
crond           0:off   1:off   2:on    3:on    4:on    5:on    6:off


最後に crontab の記述をチェック
プロセスが正しく起動している場合は、crontab の記述ミスを疑ってみる

cron 自体は実行されるけど、スクリプトが実行された形跡がない

上記チェックで問題なく、/var/log/cron にもログが出力されているのに正しく動作しない場合は、下記項目を疑ってみる。

パーミッション
まずはパーミッションを疑ってみる。cron で実行するユーザーと、手動で実行するユーザーが同じとは限らない。スクリプトファイルのパーミッションが cron で設定しているユーザーで実行できるか確認し、必要であればパーミッションを変更する。また、スクリプト自体が実行できたとしても、たとえばスクリプトの中でファイル生成などを行っている場合は、そこのパーミッションで失敗する場合もあるので注意が必要。

文字コード周り
UTF-8 の BOM 付きでファイルを保存していた場合、先頭行のインタプリタ(たとえば perl なら #! /usr/bin/perl -w の部分)が正しく認識されず、正しく動作しないことがある。この場合は、BOM を外すなどして対応する。vim の場合、下記を実行することで BOM をつけたり外したりすることが可能。

BOM つきにする

:set fenc=utf-8 bomb

BOM なしにする

:set nobomb

また、バイナリモードで表示する -b オプションを使用してファイルを開くと、BOM 付きかどうか確認できる (feff の部分が BOM)。

<feff>#! /usr/bin/perl -w
use strict;

# ファイル保存
open my $fh, ">", "/home/tamulapin/badfeeling.txt" or die "error:$!";
    print $fh rand(10);
    print $fh "\n";
close $fh;

vim 以外で BOM の確認とか追加/削除がしたい場合はここら辺(コマンドラインでUTF-8テキストのBOMを追加したり削除したりする | skmks) が参考になりそう。そのほか、改行コードが CR+LF になっていれば LF にするなど試してみるといいかもしれない。

それでも原因が分からない

どうしても分からなければログを出力しちゃう。crontab の最後に、実行結果をファイル出力しちゃえば原因が特定できる場合がある。

* * * * * /usr/bin/perl /home/tamulapin/waraw.pl >>/tmp/exec.log 2>>/tmp/exec_error.log


これらを試してみればたいていは解決するはず。

おしまい