あるcrontabが正常に動作しているかどうかを確認したい。このようなジョブを追加しました。
*/2 * * * * /path_to_my_php_script/info.php >/dev/null 2>&1
nullデバイスにリダイレクトしていることはわかっていますが、上記のコマンドが良いかどうかはわかりません。
*Edit 1: /var/log/syslogでは、2分ごとに以下のエラーが発生します。
(CRON) error (grandchild #2788 failed with exit status 2)
*エディット2:この新しいジョブでは、ログにエラーはありません。
*/2 * * * * /usr/bin/php /path_to_my_php_script/info.php >/dev/null 2>&1
crontabエントリーの構文は正しいようですね。確かに、"crontab -e
"を使ってcrontabを編集した場合(当然ですが)、構文的に無効なcrontabエントリを指定した場合はエラーになります。
1.まず、コマンドラインから /path_to_my_php_script/info.php
は正しく実行されますか?
2.その場合、次のようにしても正しく実行されますか?
/bin/sh -c "(export PATH=/usr/bin:/bin; /path_to_my_php_script/info.php </dev/null)"
3.それがうまくいったら、次のように動作しますか?
/bin/sh -c "(export PATH=/usr/bin:/bin; /path_to_my_php_script/info.php </dev/null >/dev/null 2>&1)"
ステップ(3)は、cronがあなたのプログラムを実行する方法に似ています("man 5 cron"に記載されています。
最も考えられる問題は、cronがあなたのプログラムを実行するために使用しているPATHが制限されすぎていることです。そのため、次のような内容をcrontabエントリの先頭に追加するとよいでしょう(スクリプトが必要とするディレクトリを追加する必要があります)。
PATH=~/bin:/usr/bin/:/bin
また、cronはデフォルトではbashではなく/bin/sh
を使用することに注意してください。また、cronはデフォルトでbashではなく、/bin/sh
を使用することに注意してください。bashが必要な場合は、crontabファイルの最初に以下を追加します。
SHELL=/bin/bash
これらの変更は、すべてのcrontabエントリに影響します。これらの値を自分のinfo.php
プログラム用に変更したいだけなら、次のようにします。
*/2 * * * * /bin/bash -c ". ~/.bashrc; /path_to_my_php_script/info.php"
また、"mail"が設定されているシステム(言い換えれば、MTAが設定されているシステム[sendmail/postfix/etc])では、crontabプログラムからの出力はすべて自動的にメールで送信されることにも触れておきましょう。デフォルトのUbuntuデスクトップシステムにはローカルメールが設定されていませんが、サーバーで作業している場合は、ターミナルで"mail"と入力するだけで、すべてのcronメールを見ることができます。これは、"at
"コマンドにも当てはまります。
エラー出力を/dev/nullにリダイレクトせず、cronの出力にgrep /var/log/syslogを使用する。
grep cron /var/log/syslog
で /etc/crontab
や /etc/cron.d/
内のファイルを編集した後、ファイルを保存する際にすぐにエラーを表示することができます。
tail -f /var/log/syslog | grep --line-buffered cron
編集に問題がなければ、RELOAD
の通知が表示されるだけで、エラーは次のように発生します。
Jul 9 09:39:01 vm cron[1129]: Error: bad day-of-month; while reading /etc/cron.d/new
terminalコマンドでアクティブなcronを確認することができます。
crontab -l
ここでは、パラメータを順に説明します。
最小値 (0 - 59)
時間 (0 - 23)
3.月の日(1~31
月 (1 - 12)
曜日(0~6)(日曜日=0
コマンド
つまり、毎正時の最初の1分ごとにスクリプトを呼び出していることになります。テストのためには、もっと頻繁に出力を確認する必要があります。
* * * * * <command> #Runs every minute
これで1分ごとに呼び出されます。