外部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ジョブから実行する場合と、ターミナルから手動で実行する場合(動作しているように見える)で、これが異なる方法で実行される理由はありますか?.
問題の特定に役立つ可能性のあるstderr\stdout出力を取得している可能性があります。通常、これは自分宛にメールで送信されますが、そうでない場合は、crontabエントリの最後にすべての出力の特定のリダイレクトをファイルに追加してみてください。
0 */3 * * * /usr/bin/php /var/acme/cron/api_update_db.php &> /tmp/cron.output
crontab -u <username> -e
簡単に言えば、データベースへの適切な資格情報を持つユーザーとしてcron
を実行します。 ソース
使用している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の資格情報がある場合、これは機能しません。