为什么crontab没有执行我的PHP脚本?

时间:2011-09-13 06:02:38

标签: php crontab

我已经构建了一个php文件来检查一些结果,所以我需要设置一个cronjob。

我设置一个每30分钟运行一次,以便结果发送。但是,我不知道为什么我的crontab每30分钟就没有运行。

以下是我设置crontab的方法:

*/30 * * * * php /var/www/html/result.php

我已确认我的文件目录是否正确。关于时间部分我不确定:是不是可以使用*/30 * * * *30 * * * *?我设置*/30 * * * *但没有效果。

13 个答案:

答案 0 :(得分:44)

鉴于

*/30 * * * * php /var/www/html/result.php

它有多种可能性无效:

  1. 首先,检查php /var/www/html/result.php的简单执行是否很重要。这是必需的。但不幸的是,实现这一点并不意味着问题得到解决。

  2. 必须添加php二进制文件的路径。

    */30 * * * * php /var/www/html/result.php
    

    要改为

    */30 * * * * /usr/bin/php /var/www/html/result.php
    

    或来自which php的任何内容。

  3. 检查脚本对运行crontab的用户的权限。

    授予文件执行权限:chmod +x file。并确保crontab由具有执行脚本权限的用户启动。还要检查用户是否可以访问该文件所在的目录。

  4. 为了更安全,您还可以在脚本顶部添加php路径,例如:

    #!/usr/bin/php -q
    <?php
    
     ...
    
    ?>
    
  5. 确保用户有权使用crontab。检查他是否在/etc/cron.d/deny文件中。另外,做一个基本测试,看看它是crontanb还是php问题。

    * * * * * touch /tmp/hello
    
  6. 将脚本的结果输出到日志文件,格式为William Niu suggested

    */30 * * * * /usr/bin/php /var/www/html/result.php > /tmp/result
    
  7. 使用-f选项执行脚本:

    */30 * * * * /usr/bin/php -f /var/www/html/result.php > /tmp/result
    

  8. 总结,有很多可能的原因。其中一个应该解决问题。

答案 1 :(得分:7)

可能是因为php不在路径中。 crontab有一个非常小的path。所以,包括你的PHP程序的完整路径。

您可以通过将输出传输到文件来测试您的cron命令,例如

*/30 * * * * php /var/www/html/result.php > /tmp/result.log

来自this reference page,在“Crontab环境”下:

  

cron用来自用户HOME目录的命令调用   shell,(/ usr / bin / sh)。 cron为每个人提供默认环境   shell,定义:

HOME=user’s-home-directory 
LOGNAME=user’s-login-id
PATH=/usr/bin:/usr/sbin:. 
SHELL=/usr/bin/sh

此外,所有平台可能都不支持/30语法,因此,请尝试将其更改为0,30

答案 2 :(得分:6)

有类似的问题;从命令行,它工作,但从cron,没有去。

有一个“include(”。/ connect.php“);在我的PHP代码中用于db的东西。

删除了它,并将connect.php代码直接添加到php脚本中,并且它来自cron。

答案 3 :(得分:5)

我在Ubuntu 14.04.1上遇到了类似的问题,问题原来是我修改crontab的方式:

我使用sudo crontab -e而非crontab -e,这导致我的更改被忽略。

答案 4 :(得分:3)

我对此很有趣。尽管我的脚本可以手动运行,但不能从crontab运行。

结果表明,因为脚本是从/usr/bin/php运行的,而不是文件的位置(就像我手动运行时一样),所以我的php require找不到我想要的文件。更改该地址以反映完整的地址。

/usr/bin/php -f /var/www/myfile.php身份运行脚本进行故障排除有助于我发现问题

答案 5 :(得分:1)

经过一天的困惑,为什么我的脚本会直接工作(通过电子邮件将数据发送到gmail帐户)我发现当我点击网址并且所有cron发送都进入垃圾邮件时,所有故意发送都有效。不知道为什么,但我以为我会分享它。

答案 6 :(得分:0)

威廉的回答向我展示了道路。就我而言,我的代码中有一个“include(”connection.php“)”。我将connection.php更改为/my/full/path/connection.php。我有一些相对路径的rename()调用,我改为绝对路径。这对我有用。我希望它可以帮助别人。

答案 7 :(得分:0)

简单合理的方式:

检查/ var / log / cron中的cron日志将为您提供非常有用的信息

  

less / var / log / cron

例如,

我的cron条目是* * * * * /usr/bin/php /cat.php&lt; ==每分钟运行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 :(得分:0)

您确定它没有运行吗?如果您使用exec,请意识到您是从cron运行的,并且需要所有内容的完整路径,因此,您需要使用Data来代替cp

答案 9 :(得分:0)

您可以使用*/30 * * * * wget http://my.domain.com/path/to/php/result.php

但是Crontab使用运行crontab -e的当前用户执行任务。当您使用wget时,Apache将使用www-data用户/组对

对其进行处理。
  1. 首先,确保脚本按预期工作。

    $ php /var/www/html/result.php
    
  2. 第二,编辑Apache用户帐户的crontab

    $ sudo crontab -u www-data -e
    

    $ sudo crontab -u root -e
    
  3. 现在添加crontab并输出到日志文件。

    */30 * * * * php /var/www/html/result.php > /tmp/result.log
    

答案 10 :(得分:0)

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的语法是* * * * *用户命令(检查用户)

* * * * * someuser /usr/bin/php -f /var/www/html/cron.php >/tmp/result.txt

答案 11 :(得分:0)

使用 Ubuntu Vesta

以下命令对我来说很完美

/usr/bin/php /home/admin/web/mydomain.com/public_html/mycode.php

如有任何问题,请发表评论,祝您愉快:)

答案 12 :(得分:0)

我也被困住了。我正在使用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

它奏效了!!! 希望这对像我这样的新手有帮助:)