我有一个连接到外部API的PHP脚本返回一些数据并更新数据库表。 我可以通过我的命令行/ SSHterminal直接运行它,它工作正常(大约需要5分钟才能完成)。
使用crontab我有'cronned'这个脚本,所以它运行每三个小时使用下面的命令:
0 */3 * * * /usr/bin/php /var/acme/cron/api_update_db.php
使用syslog我可以看到这个cron已经运行了,但是看起来cron实际上每三个小时运行一次,但是数据库看起来并没有被更新。 但是,当我通过导航到该目录并input以下内容来手动运行完全相同的脚本时,它将运行(并更新数据库)
php api_update_db.php
当从cron作业运行,然后从terminal手动运行(似乎工作)时,会有这样的执行不同的原因。
你可能会得到一些stderr \标准输出,这可能有助于确定问题。 通常这最终会被邮寄给自己,但如果不尝试添加所有输出的特定redirect到您的crontab项的结尾到一个文件,例如:
0 */3 * * * /usr/bin/php /var/acme/cron/api_update_db.php &> /tmp/cron.output
crontab -u <username> -e
简短的回答是,运行cron作为一个具有适当的数据库凭据的用户。 资源
根据您使用的cron版本/types,命令的输出通常通过电子邮件发送给某人。 在传统的风格,你可以把
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执行,这可能不是POSIX标准,它是一个bash扩展(可能也被其他shell接pipe,但不是所有的)。
另一个要注意的是,这是得到执行没有任何你的环境variables等,所以如果你有.bashrc设置为环境variables的数据库证书比这不会工作。