为啥 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】:

使用带有 VestaUbuntu

以下命令非常适合我,

/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 脚本?的主要内容,如果未能解决你的问题,请参考以下文章

Crontab 不执行 Python 脚本? [复制]

我的linux定时任务不起作用是为啥?

我的linux定时任务不起作用是为啥?

linux 下cron定时任务为啥没执行

如何使用Linux的Crontab定时执行PHP脚本的方法

crontab执行时间和系统时间不一致