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

use*_*885 13 php crontab

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

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

以下是我设置crontab的方法:

*/30 * * * * php /var/www/html/result.php
Run Code Online (Sandbox Code Playgroud)

我已经确认我的文件目录是正确的.我不确定的是时间部分:是不是可以使用*/30 * * * *30 * * * *?我设定*/30 * * * *并没有奏效.

fed*_*qui 52

特定

*/30 * * * * php /var/www/html/result.php
Run Code Online (Sandbox Code Playgroud)

它有多种可能性不起作用:

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

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

    */30 * * * * php /var/www/html/result.php
    
    Run Code Online (Sandbox Code Playgroud)

    改为

    */30 * * * * /usr/bin/php /var/www/html/result.php
    
    Run Code Online (Sandbox Code Playgroud)

    或者来自的任何东西which php.

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

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

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

    #!/usr/bin/php -q
    <?php
    
     ...
    
    ?>
    
    Run Code Online (Sandbox Code Playgroud)
  5. 确保用户有权使用crontab.检查他是否在/etc/cron.d/deny文件中.此外,进行基本测试,看看它是crontanb还是php问题.

    * * * * * touch /tmp/hello
    
    Run Code Online (Sandbox Code Playgroud)
  6. 正如William Niu建议的那样,将脚本的结果输出到日志文件中.

    */30 * * * * /usr/bin/php /var/www/html/result.php > /tmp/result
    
    Run Code Online (Sandbox Code Playgroud)
  7. 使用该-f选项执行脚本:

    */30 * * * * /usr/bin/php -f /var/www/html/result.php > /tmp/result
    
    Run Code Online (Sandbox Code Playgroud)

总而言之,有许多可能的原因.其中一个应该解决问题.

  • 另一种变体,也许是#8,可能是由于.php文件中的依赖性(它将通过所有#1-#7但仍然不起作用).示例:include'config.inc.php'; 一种修复方法:30 2***cd/path/to/phpfiles /;/usr/bin/php -q script.php (2认同)
  • 对我来说,这是文件路径名。就是我在php程序中使用“test.log”的时候,没有起作用。但是,在我将其修复为脚本中文件的完整路径后,它就起作用了。“/home/whoever/test/test.log” (2认同)

Wil*_*Niu 7

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

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

*/30 * * * * php /var/www/html/result.php > /tmp/result.log
Run Code Online (Sandbox Code Playgroud)

此参考页面的 "Crontab Environment"下:

cron使用shell(/ usr/bin/sh)从用户的HOME目录调用该命令.cron为每个shell提供默认环境,定义:

HOME=user’s-home-directory 
LOGNAME=user’s-login-id
PATH=/usr/bin:/usr/sbin:. 
SHELL=/usr/bin/sh
Run Code Online (Sandbox Code Playgroud)

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


小智 6

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

有一个"include("./ connect.php");在我的PHP代码中为db的东西.

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


nif*_*ifo 5

我有一个类似的问题,Ubuntu 14.04.1问题结果是我修改crontab的方式:

我正在使用sudo crontab -e而不是公正crontab -e,这导致我的更改被忽略.


小智 5

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

事实证明,由于脚本是从运行的,/usr/bin/php而不是文件的位置(如我手动运行时的位置),因此我的php require找不到所需的文件。更改它以反映完整的地址即可解决。

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