我有一个 php 脚本,它连接到外部 API,返回一些数据并更新数据库表。我可以直接通过命令行/SSH 终端运行它,它运行良好(大约需要 5 分钟才能完成)。
我使用 crontab 将此脚本“cronned”,以便它每三个小时运行一次,使用以下命令:
0 */3 * * * /usr/bin/php /var/acme/cron/api_update_db.php
使用系统日志我可以看到这个 cron 已经运行,但看起来 cron 实际上每三个小时运行一次,正如预期的那样,但数据库似乎没有更新?但是当我通过导航到该目录并输入以下内容手动运行完全相同的脚本时,它会运行(并更新数据库)
php api_update_db.php
从 cron 作业运行和从终端手动运行(似乎有效)时执行方式有何不同,这其中的原因是什么?
答案1
您可能会收到一些 stderr\stdout 输出,这可能有助于识别问题。通常这些输出会邮寄给您自己,但如果没有,请尝试将所有输出的特定重定向添加到 crontab 条目末尾的文件,例如:
0 */3 * * * /usr/bin/php /var/acme/cron/api_update_db.php &> /tmp/cron.output
答案2
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
扩展(可能也被其他 shell 接管,但不是全部)。
要注意的另一件事是,这在没有任何环境变量等的情况下执行。因此,如果您将 DB 的凭据设置为环境变量,.bashrc
那么这将不起作用。