为啥 crontab 不执行我的 PHP 脚本?
Posted
技术标签:
【中文标题】为啥 crontab 不执行我的 PHP 脚本?【英文标题】:Why is crontab not executing my PHP script?为什么 crontab 不执行我的 PHP 脚本? 【发布时间】:2011-11-15 21:11:40 【问题描述】:我已经建立了一个 php 文件来检查一些结果,所以我需要设置一个 cronjob。
我设置为每 30 分钟运行一次,以便发送结果。但是,我不知道为什么我的 crontab 没有每 30 分钟运行一次。
这是我设置 crontab 的方法:
*/30 * * * * php /var/www/html/result.php
我已经确认我的文件目录是正确的。我不确定的是时间部分:不能使用 */30 * * * *
或 30 * * * *
吗?我设置了*/30 * * * *
,没有用。
【问题讨论】:
*/30 * * * *
将每 30 分钟执行一次,而 30 * * * *
将在每小时的第 30 分钟执行。这是一个[有用的链接]('cyberciti.biz/faq/…),您可以轻松地在 Google 上搜索更多信息。
另外,尝试直接从命令行运行php -f /var/www/html/result.php
,看看你得到什么样的输出;如果您的输出显示致命错误,则您的问题可能与您的 PHP 脚本有关。
【参考方案1】:
可能是因为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 唯一错误在哪里)是我的解决方案,谢谢! :)【参考方案2】:给定
*/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。
总结,可能的原因有很多。其中一个应该可以解决问题。
【讨论】:
他们都没有和我一起解决。将文件的权限更改为 744 但没有运气:( 您也可以查看***.com/tags/crontab/info中的“调试crontab”部分 另一种变体,可能是#8,可能是由于 .php 文件内部的依赖关系(它会传递所有 #1-#7 但仍然不起作用)。示例:包括'config.inc.php';一种修复方法: 30 2 * * * cd /path/to/phpfiles/; /usr/bin/php -q script.php 对我来说,这是文件路径名。也就是说,当我在php程序中使用“test.log”时,它不起作用。但是,在我将它修复为脚本中文件的完整路径后,它就可以工作了。 “/home/whoever/test/test.log”【参考方案3】:我在Ubuntu 14.04.1
上遇到了类似的问题,问题原来是我修改 crontab 的方式:
我使用的是sudo crontab -e
而不仅仅是crontab -e
,这导致我的更改被忽略。
【讨论】:
根据我对sudo
的理解,这似乎没有意义。如果有的话,sudo
应该是可以为所欲为的用户之一。
我认为通过附加 sudo 可以选择 root 用户(root 用户的 cron 设置)【参考方案4】:
有类似的问题;从命令行,它工作,但从 cron,不行。
在我的 php 代码中有一个 "include ("./connect.php"); 用于 db 的东西。
删除它,并将 connect.php 代码直接添加到 php 脚本中,它可以从 cron 运行。
【讨论】:
请详细说明您的答案评论 你也解决了我的问题。我包含了“connect.php”的完整路径并且它起作用了。【参考方案5】:经过一天的困惑,为什么我的脚本可以直接工作(通过电子邮件将数据发送到 gmail 帐户),我发现当我单击 url 并且所有 cron 发送都进入垃圾邮件时,所有故意发送都有效。不知道为什么,但我想我会分享它。
【讨论】:
【参考方案6】:Willem 的回答为我指明了方向。就我而言,我的代码中有一个“include(“connection.php”)”。我将 connection.php 更改为 /my/full/path/connection.php。我有一些使用相对路径的 rename() 调用,然后我更改为绝对路径。这对我有用。我希望它可以帮助别人。
【讨论】:
【参考方案7】:简单合理的方式:
检查 /var/log/cron 的 cron 日志将为您提供非常有用的信息
少 /var/log/cron
例如,
我的 cron 条目是 * * * * * /usr/bin/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。如果日志条目在那里,但您仍然没有得到所需的输出,那么命令/应用程序逻辑有问题
【讨论】:
【参考方案8】:我对此有一个有趣的看法。虽然我的脚本会手动运行,但它们不会从 crontab 运行。
原来是因为脚本是从 /usr/bin/php
运行的,而不是文件的位置(就像我手动运行它时那样)我的 php require
没有找到我想要的文件。更改它以反映完整地址已修复它。
以/usr/bin/php -f /var/www/myfile.php
身份运行脚本进行故障排除帮助我找到了问题
【讨论】:
【参考方案9】:你确定它没有运行吗?如果您使用 exec,请意识到您是从 cron 运行的,并且需要所有内容的完整路径,因此您需要使用 /bin/cp
,而不是 cp
。
【讨论】:
【参考方案10】:您可以使用*/30 * * * * wget http://my.domain.com/path/to/php/result.php
但 Crontab 使用运行 crontab -e
的当前用户执行任务。当您使用 wget 时,它由 Apache 使用 www-data
用户/组对处理
首先,确保脚本按预期工作。
$ php /var/www/html/result.php
其次,编辑 Apache 用户帐户的 crontab
$ sudo crontab -u www-data -e
或
$ sudo crontab -u root -e
现在添加 crontab 并输出到日志文件。
*/30 * * * * php /var/www/html/result.php > /tmp/result.log
【讨论】:
编辑 www-data 用户的 crontab 解决了我的问题【参考方案11】:Centos 7
记录在案(它可能适用于其他发行版)
我有下一个脚本
* * * * * /usr/bin/php -f /var/www/html/cron.php >/tmp/result.txt
但是执行失败。
在 /var/log/cron 日志文件中,我找到了下一行
crond[2213]: (/usr/bin/php) ERROR (getpwnam() failed)
那是什么?
很简单,corn的语法是* * * * * user command (check user)
* * * * * someuser /usr/bin/php -f /var/www/html/cron.php >/tmp/result.txt
【讨论】:
【参考方案12】:使用带有 Vesta 的 Ubuntu :
以下命令非常适合我,
/usr/bin/php /home/admin/web/mydomain.com/public_html/mycode.php
如果您有任何问题,请随时发表评论,祝您有美好的一天:)
【讨论】:
【参考方案13】:我也被困住了。我正在使用 centos 7 并且不得不运行几个 php 脚本。我最初尝试过这个
$crontab -e
& 插入要在午夜 12 点执行的脚本。
0 0 * * * usr/bin/php /var/www/html/cronjob/myscript.php
但是在 var /var/spool/mail/centos 中,它在邮件中给了我一个错误
/bin/sh: usr/bin/php: No such file or directory
然后我就这样用wget了,
$ crontab -e
0 0 * * * wget https://myapplicationurl/var/www/html/cronjob/myscript.php
这也给了我一个错误。
ERROR 404: Not Found.
然后我意识到我指定文件夹的错误,因为url已经指向html文件夹,我要从那里指定文件夹,像这样
0 0 * * * wget http://myapplicationurl/cronjob/myscript.php
它成功了! 希望这对像我这样的新手有帮助:)
【讨论】:
以上是关于为啥 crontab 不执行我的 PHP 脚本?的主要内容,如果未能解决你的问题,请参考以下文章