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
これらを試してみればたいていは解決するはず。
おしまい