【问题标题】:crontab not running a php script properlycrontab 没有正确运行 php 脚本
【发布时间】:2013-04-07 13:24:21
【问题描述】:

我正在尝试运行基于 SendGrid 和 cron 的自动邮件服务。 我已经尝试了所有可能的组合来让 PHP 解释器运行我的脚本, 虽然 cron 日志说作业每分钟执行一次,但我定义的日志文件仍然是空的,也没有收到任何电子邮件,但是当我通过浏览器访问页面时一切正常。

mydev.com 是我在我的机器上使用的虚拟主机,我没有对 php 配置进行任何更改(最大执行时间等)。

另外,我在网上做了研究,我已经安装了 php5-cli,以及所有需要的依赖项。

以下是我在终端输入 sudo crontab -e 后添加到 cron 文件中的行:

* * * * * php /var/www/mydev/dev/mailServiceTest.php >> /var/www/mydev/CRON_LOG.txt 2> /dev/null
* * * * * /usr/bin/php /var/www/mydev/dev/mailServiceTest.php >> /var/www/mydev/CRON_LOG.txt 2> /dev/null
* * * * * /usr/bin/php http://mydev.com/dev/mailServiceTest.php   >> /var/www/mydev/CRON_LOG.txt 2> /dev/null

* * * * * /usr/bin/lynx http://mydev.com/dev/mailServiceTest.php >> /var/www/mydev/CRON_LOG.txt 2> /dev/null

这是 cron 日志的输出:

Apr 15 15:13:01 oleg-Lenovo-G580 CRON[8948]: (root) CMD (/usr/bin/php http://mydev.com/dev/mailServiceTest.php   >> /var/www/mydev/CRON_LOG.txt 2> /dev/null)
Apr 15 15:13:01 oleg-Lenovo-G580 CRON[8947]: (root) CMD (php /var/www/mydev/dev/mailServiceTest.php >> /var/www/mydev/CRON_LOG.txt 2> /dev/null)
Apr 15 15:13:01 oleg-Lenovo-G580 CRON[8949]: (root) CMD (/usr/bin/php /var/www/mydev/dev/mailServiceTest.php >> /var/www/mydev/CRON_LOG.txt 2> /dev/null)
Apr 15 15:13:01 oleg-Lenovo-G580 CRON[8953]: (root) CMD (/usr/bin/lynx http://mydev.com/dev/mailServiceTest.php >> /var/www/mydev/CRON_LOG.txt 2> /dev/null)
Apr 15 15:14:01 oleg-Lenovo-G580 CRON[8964]: (root) CMD (/usr/bin/lynx http://mydev.com/dev/mailServiceTest.php >> /var/www/mydev/CRON_LOG.txt 2> /dev/null)
Apr 15 15:14:01 oleg-Lenovo-G580 CRON[8966]: (root) CMD (php /var/www/mydev/dev/mailServiceTest.php >> /var/www/mydev/CRON_LOG.txt 2> /dev/null)
Apr 15 15:14:01 oleg-Lenovo-G580 CRON[8965]: (root) CMD (/usr/bin/php http://mydev.com/dev/mailServiceTest.php   >> /var/www/mydev/CRON_LOG.txt 2> /dev/null)
Apr 15 15:14:01 oleg-Lenovo-G580 CRON[8970]: (root) CMD (/usr/bin/php /var/www/mydev/dev/mailServiceTest.php >> /var/www/mydev/CRON_LOG.txt 2> /dev/null)
Apr 15 15:15:01 oleg-Lenovo-G580 CRON[8992]: (root) CMD (/usr/bin/php /var/www/mydev/dev/mailServiceTest.php >> /var/www/mydev/CRON_LOG.txt 2> /dev/null)
Apr 15 15:15:01 oleg-Lenovo-G580 CRON[8994]: (root) CMD (php /var/www/mydev/dev/mailServiceTest.php >> /var/www/mydev/CRON_LOG.txt 2> /dev/null)
Apr 15 15:15:01 oleg-Lenovo-G580 CRON[8993]: (root) CMD (/usr/bin/php http://mydev.com/dev/mailServiceTest.php   >> /var/www/mydev/CRON_LOG.txt 2> /dev/null)
Apr 15 15:15:01 oleg-Lenovo-G580 CRON[8998]: (root) CMD (/usr/bin/lynx http://mydev.com/dev/mailServiceTest.php >> /var/www/mydev/CRON_LOG.txt 2> /dev/null)
Apr 15 15:16:01 oleg-Lenovo-G580 CRON[9009]: (root) CMD (/usr/bin/php /var/www/mydev/dev/mailServiceTest.php >> /var/www/mydev/CRON_LOG.txt 2> /dev/null)
Apr 15 15:16:01 oleg-Lenovo-G580 CRON[9011]: (root) CMD (php /var/www/mydev/dev/mailServiceTest.php >> /var/www/mydev/CRON_LOG.txt 2> /dev/null)
Apr 15 15:16:01 oleg-Lenovo-G580 CRON[9012]: (root) CMD (/usr/bin/lynx http://mydev.com/dev/mailServiceTest.php >> /var/www/mydev/CRON_LOG.txt 2> /dev/null)
Apr 15 15:16:01 oleg-Lenovo-G580 CRON[9010]: (root) CMD (/usr/bin/php http://mydev.com/dev/mailServiceTest.php   >> /var/www/mydev/CRON_LOG.txt 2> /dev/null)

非常感谢任何帮助!

哦。

编辑:

下面是应该执行的代码:

<?php
require_once($_SERVER['DOCUMENT_ROOT'] . '/classes/mailingService.php');

$myMail = new mailingService();
$myMail->execute();
$myMail->outputDuration();

?>

现在,即使我添加 'echo 1;'在文件的开头,或者在它的结尾,没有什么太大的变化,输出文件 CRON_LOG.txt 保持为空

【问题讨论】:

  • 这条线似乎没问题* * * * * /usr/bin/php /var/www/mydev/dev/mailServiceTest.php &gt;&gt; /var/www/mydev/CRON_LOG.txt 2&gt; /dev/null。你的脚本中有绝对路径吗?手动执行是否正常?
  • 没有,我的脚本使用 DOCUMENT_ROOT SERVER 超级全局来包含它使用的任何文件。是的,当通过浏览器手动访问时,一切似乎都正常。
  • 您必须在脚本中使用绝对路径,因为当前工作目录可能不同,具体取决于您是从浏览器还是命令行/cron 加载脚本
  • @OlegTikhonov $_SERVER['DOCUMENT_ROOT'] 很可能不包含您认为它在 CLI 环境中所做的事情。您应该改为基于__DIR__(调用脚本的位置)构造绝对路径。
  • $_SERVER['DOCUMENT_ROOT'] 在使用 cli 时未填充(但在使用浏览器时):)

标签: php ubuntu cron crontab


【解决方案1】:

$_SERVER['DOCUMENT_ROOT'] - 它是网络服务器的变量。 CRON 在执行脚本时不使用 apache。

【讨论】:

    【解决方案2】:
            • php /var/www/mydev/dev/mailServiceTest.php

    'php' 在 cron 守护进程的路径中吗?

            • /usr/bin/php /var/www/mydev/dev/mailServiceTest.php

    更好(您确认这是 php 的正确路径吗?

    大多数情况下这是有道理的 - 但如果您需要以每分钟一次的频率运行 any 命令,那么通过 cron 运行它远非理想的解决方案。

    我的脚本使用 DOCUMENT_ROOT SERVER 超级全局

    但这对于 CLI SAPI 来说毫无意义/为空

    不会按照你的期望进行。

    可能有效,但 lynx 旨在作为用户驱动的浏览器,甚至可能不会在这种情况下启动 - wget 或 curl 会更好。

    从 cron 日志来看,crond 正在做它应该做的事情。

    您丢弃 STDERR 意味着您看不到很多错误消息。而且你也没有写任何对 STDOUT 有用的东西。目标日志文件的时间戳是否正在更新?

    您是安装 crontab 文件还是只是编辑它?

    如果您需要 DOCUMENT_ROOT,那么您需要通过 HTTP 访问脚本 - 检查您的系统是否可以解析它自己的名称并使用 wget 或 curl(即,从 ssh 会话尝试wget http://mydev.com/dev/mailServiceTest.php)。

    【讨论】:

    • 在这种情况下是否最好使用命名空间。它会起作用吗?
    • 命名空间与所描述的问题无关
    • 这里面有很多问题,如果有答案就好了。例如“您确认这是 php 的正确路径吗?”。我该如何验证?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    • 2012-10-28
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    相关资源
    最近更新 更多