我已经建立了一个php文件来检查某些结果,因此我需要设置cronjob。
我将其设置为每30分钟运行一次,以便发送结果。但是,我不知道为什么我的crontab每30分钟不运行一次。
这是我设置crontab的方式:
*/30 * * * * php /var/www/html/result.php
我已确认我的文件目录正确。我不确定时间部分:是否可以使用*/30 * * * *
或30 * * * *
?我设置为*/30 * * * *
,但没有起作用。
给出
*/30 * * * * php /var/www/html/result.php
存在多种不起作用的可能性:
首先,重要的是检查是否简单执行php /var/www/html/result.php
。这是必需的。但是不幸的是,完成此操作并不意味着问题已解决。
必须添加php
二进制文件的路径。
*/30 * * * * php /var/www/html/result.php
更改为
*/30 * * * * /usr/bin/php /var/www/html/result.php
或来自which php
的任何内容。
检查脚本对运行crontab的用户的许可。
授予文件执行权限:chmod +x file
。并确保crontab是由有权执行脚本的用户启动的。还要检查用户是否可以访问文件所在的目录。
为了更加安全,您还可以在脚本顶部添加php路径,例如:
#!/usr/bin/php -q
<?php
...
?>
请确保用户有权使用crontab。检查他是否在/etc/cron.d/deny
文件中。另外,进行基本测试以查看它是否是crontanb或php问题。
* * * * * touch /tmp/hello
将脚本结果输出到日志文件中,作为William Niu suggested。
*/30 * * * * /usr/bin/php /var/www/html/result.php > /tmp/result
使用-f
选项执行脚本:
*/30 * * * * /usr/bin/php -f /var/www/html/result.php > /tmp/result
请确保crontab中的格式正确。例如,您可以使用站点Crontab.guru。
总结,有许多可能的原因。其中之一应该可以解决问题。
可能是因为php不在路径中。 crontab
具有非常小的path
。因此,包括您的php程序的完整路径。
您可以通过将输出传递到文件中来测试cron命令,例如
*/30 * * * * php /var/www/html/result.php > /tmp/result.log
从this reference page,在“ Crontab环境”下:
cron使用以下命令从用户的HOME目录中调用命令:外壳程序(/ usr / bin / sh)。 cron为每一个提供默认环境外壳,定义:
HOME=user’s-home-directory
LOGNAME=user’s-login-id
PATH=/usr/bin:/usr/sbin:.
SHELL=/usr/bin/sh
此外,并非所有平台都支持/30
语法,因此,请尝试将其更改为0,30
。
有类似的问题;从命令行运行,但是从cron运行,没有进展。
在我的db素材的php代码中有一个“ include(” ./connect.php“);
删除了它,并将connect.php代码直接添加到php脚本中,并且可以从cron运行。
我在Ubuntu 14.04.1
上遇到了类似的问题,问题出在我修改crontab的方式上:
我使用的是sudo crontab -e
,而不仅仅是crontab -e
,这导致我的更改被忽略。
我对此很有趣。尽管我的脚本可以手动运行,但不能从crontab运行。
结果表明,因为脚本是从/usr/bin/php
运行的,而不是文件的位置(就像我手动运行时的位置一样),所以我的php require
找不到我想要的文件。更改该地址以反映固定的完整地址。
通过以/usr/bin/php -f /var/www/myfile.php
身份运行脚本进行故障排除有助于我发现问题
经过一整天的思考,为什么我的脚本可以直接运行(将电子邮件中的数据发送到gmail帐户),我发现当我单击url时,所有有意发送的邮件都起作用了,而所有cron发送的邮件都变成了垃圾邮件。不知道为什么,但我想我会分享。
威廉的回答向我展示了道路。就我而言,我的代码中有一个“ include(“ connection.php”)“。我将connection.php更改为/my/full/path/connection.php。我有一些带有相对路径的rename()调用,然后我更改为绝对路径。那对我有用。我希望它可以帮助其他人。
简单而逻辑的方式:
检查/ var / log / cron的cron日志将为您提供非常有用的信息
较少/ var / log / cron
例如,
我的cron条目为* * * * * /usr/bin/php /cat.php
<==每分钟运行一次cat.php
每次运行cron条目时,日志文件将包含与以下条目类似的条目
Jan 24 08:06:01 OlaTower CROND[13641]: (root) CMD (/usr/bin/php /cat.php)
Jan 24 08:07:01 OlaTower CROND[13641]: (root) CMD (/usr/bin/php /cat.php)
这里,每分钟都会执行一次php命令,并且每分钟都会在日志文件中有一个条目
如果条目不存在,那么crond甚至不会选择该cronjob。如果日志条目在那里并且仍然没有获得所需的输出,那么命令/应用程序逻辑有问题]
您确定它没有运行吗?如果您使用exec,请意识到您正在从cron运行,并且需要所有内容的完整路径,因此,您需要使用cp
代替/bin/cp
。