web-dev-qa-db-ja.com

cronは実行されているように見えますが、ターミナルから手動で実行した場合と同じようには実行されません。

外部APIに接続してデータを返し、データベーステーブルを更新するphpスクリプトがあります。これはコマンドライン/ SSHターミナルから直接実行でき、正常に機能します(完了するまでに約5分かかります)。

Crontabを使用してこのスクリプトを「cron」しているため、以下のコマンドを使用して3時間ごとに実行されます。

0 */3 * * * /usr/bin/php /var/acme/cron/api_update_db.php

Syslogを使用すると、このcronが実行されたことがわかりますが、実際にはcronが期待どおりに3時間ごとに実行されているようですが、データベースが更新されていないようです。しかし、そのディレクトリに移動して次のように入力することにより、まったく同じスクリプトを手動で自分で実行すると、スクリプトが実行されます(DBを更新します)。

php api_update_db.php

Cronジョブから実行する場合と、ターミナルから手動で実行する場合(動作しているように見える)で、これが異なる方法で実行される理由はありますか?.

3
Zabs

問題の特定に役立つ可能性のあるstderr\stdout出力を取得している可能性があります。通常、これは自分宛にメールで送信されますが、そうでない場合は、crontabエントリの最後にすべての出力の特定のリダイレクトをファイルに追加してみてください。

0 */3 * * * /usr/bin/php /var/acme/cron/api_update_db.php &> /tmp/cron.output
4
richardaeiou
crontab -u <username> -e 

簡単に言えば、データベースへの適切な資格情報を持つユーザーとしてcronを実行します。 ソース

3

使用しているcronのバージョン/タイプに応じて、コマンドからの出力は通常、電子メールで誰かに送信されます。あなたが置くことができる伝統的なスタイルで

MAILTO=your.login

または多分

[email protected]

スクリプトから出力を取得します。

最悪の場合は試してみてください

0 */3 * * * /usr/bin/php /var/acme/cron/api_update_db.php > /tmp/cron.output 2> /tmp/cron.error

&>を使用してもおそらくうまく機能しません-cronは/bin/shを使用して実行されます。これはおそらくbashではなく&>はPOSIX標準ではなく、bash拡張機能(他のシェルにも引き継がれる可能性がありますが、すべてではありません)。

もう1つ探す必要があるのは、これが環境変数などなしで実行されることです。したがって、.bashrcで環境変数として設定されたDBの資格情報がある場合、これは機能しません。

1
Torinthiel