【问题标题】:Cron running but functionality not workingCron 运行但功能不起作用
【发布时间】:2010-10-18 16:25:19
【问题描述】:

我有几个 PHP 文件要由 cron 运行。我使用命令设置 crons-

crontab crontab.txt

在 crontab.txt 文件中,我编写了这样的 cron 命令:-

#(Updating tutor activities) - every minute
* * * * * /usr/bin/wget -O - -q -t 1 http://project/cron/tutor_activities.php

但是所有功能都不起作用(数据库查询、发送提醒邮件等)。手动运行 URL 是可行的。

然后我把我的邮件地址放在MAILTO 并收到邮件。在邮件中,我收到了页面的整个 HTML 源代码。邮件中的预期内容是什么?为什么我的功能不起作用?

更新
如果我将我的 cron 命令更改为

 #(Updating tutor activities) - every minute
    * * * * * /usr/bin/wget http://project/cron/tutor_activities.php

仍然没有成功,这在我的邮件中 -

--15:03:01--  http://project/cron/tutor_activities.php
          => `tutor_activities.php'
Resolving project... IP Address
Connecting to test.project|IP Address|:80... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: http://project./ [following]
--15:03:01--  http://project./
          => `index.html.1'
Resolving project.... IP Address
Connecting to project.|IP Address|:80... connected.
HTTP request sent, awaiting response... 302 Found
Location: http://project/home/ [following]
--15:03:01--  http://project/home/
          => `index.html.1'
Resolving project... IP Address
Connecting to wproject|IP Address|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
index.html.1 has sprung into existence.
Retrying.

大量 index.html.1index.html.2 文件正在我的项目的根目录中累积。我不希望创建这些文件。只希望文件执行。

如果我使用这两个命令中的任何一个,结果相同 -

   * * * * * /usr/bin/wget http://project/cron/tutor_activities.php

   * * * * * wget http://project/cron/tutor_activities.php

运行php 命令并设置MAILTO 会向我发送此错误/bin/sh: php: command not found。

* * * * * php /path/to/test.php

所以,我无法使用php 命令。

我在 test.php 中写了一个简单的mailto()。通过 cron 运行时邮件不来(同时使用 wgetphp 失败)但手动运行 URL 有效。

我的问题
再次说明,我的主要问题是 cron 文件中的功能没有运行。创建文件是次要问题。

任何帮助将不胜感激

谢谢,
桑迪潘

【问题讨论】:

  • 您不需要登录您的网络系统来运行这些查询、发送邮件等,对吗?
  • 我自己找到了解决方案。我接受我的问题的细节不足以让任何人猜测实际原因。但是,这本身就是问题所在。但是感谢大家的努力。我不是手动向任何人提供赏金。让投票决定赏金。

标签: php cron crontab


【解决方案1】:

如果您想将 url 称为 cronjob,则必须使用 wget 之类的东西。如果它是您服务器上的 php 脚本,那么使用 php /...pathtomyscript.../cron/tutor_activities.php 会更容易

【讨论】:

  • @oezi,感谢您的回答,我已经在使用 wget 并且我的 wget 中的 ` -O - -q -t ` 部分是为了不输出我记得的文件。请检查我的更新。如果我删除 ` -O - -q -t `,每次 cron 运行都会创建一个文件。我不想要那个。
  • 您可以尝试执行“wget myurl > /dev/null”(或类似的东西,不知道确切的语法),这将执行没有可选参数和“存储”的“正常”wget " 自动输入到 /dev/null
  • @oezi running * * * * * php /path/to/test.php with MAILTO set 向我发送此错误/bin/sh: php: command not found。我在 test.php 中写了一个简单的mail()。通过 cron 运行(同时使用 wget 和 php)时邮件不会收到,但手动运行 URL 可以。
  • 也许你必须给出 php-interpreter 的完整路径(如“/etc/php5/bin/php”),而不是只写“php”
  • 在命令行上运行 which php,然后按照 oezi 的建议将该路径放入 cron。
【解决方案2】:

试试

哪个php

返回的路径应该和运行 Cron 文件的命令放在一起当您尝试运行 php 页面时。

/path/to/php /path/to/cron/script/

如果问题仍然存在,请尝试这样给出您的命令;请随时讨论。

【讨论】:

    【解决方案3】:

    当您使用 -O - 调用 wget 时,它会将下载的内容发送到标准输出,该标准是 cron 通过电子邮件发送给您的。在第一种情况下,它正在做它应该做的事情。

    当你在没有-O参数的情况下调用wget时,它会尝试将下载的内容保存为与正在下载的网页同名的文件。如果它存在,它会将增量器添加到名称中,如您所见。在第二种情况下,它正在做它应该做的事情。

    您的问题不清楚您希望输出到哪里,但如果您想每次都将输出保存到同一个文件,请使用 -O myfilename.html

    【讨论】:

    • 我不想创建这些文件。我只想执行这些文件并产生结果。但是由于结果没有出现(数据库更改,邮件没有发送)。
    • 好的,您的大部分问题都与 wget 的输出有关,您甚至不关心它。我肯定会继续向tutor_activities.php 添加一些服务器端日志调试。如果它被调用,无论哪种方式从 wget 调用它都无关紧要。
    【解决方案4】:

    如果您从 cron/命令行运行 PHP,请确保将完整路径放入 php 可执行文件

    【讨论】:

      【解决方案5】:

      PHP 完全有可能不在 cron 环境中的路径中——它肯定不会有与常规 shell 相同的设置。尝试在 cron 命令中使用 php 解释器和 php 脚本的绝对路径:

      * * * * * /path/to/php /path/to/test.php
      

      至于文件的创建,你只需要在你的 wget 命令中添加一个重定向:

      wget -O - ... http://....     > /dev/null
      

      -O - 强制 wget 将下载的任何内容写入标准输出,然后 cron 会很高兴地通过电子邮件发送给您。通过在命令末尾添加> /dev/null,此输出将改为转到天空中的 Great Bitbucket。如果您也不希望通过电子邮件发送 wget 的 stderr 输出,您还可以在 /dev/null 之后添加 2&>1,这会进一步将 stderr 重定向到 stdout,现在将转到 /dev/null。

      【讨论】:

      • +1。使用 which php 发现 PHP 可执行文件的完整路径。
      【解决方案6】:

      我自己发现了问题。我没有在手动运行的 crontab 文件中放入相同的 URL,这是我的错误。

      手动运行时,我只是在 URL 中输入 test,我的浏览器保存的 URL 列表出现了,我选择了 URL http://www.test.project.com/cron/tutor_activities.php,但在 crontab 文件中我输入了 http://test.project.com/cron/tutor_activities.php。我错误地假设这会运行http://www.test.project.com/cron/tutor_activities.php(因为我们有一个重写规则来添加www

      但重写规则将其重定向到http://www.test.project.com/home。这就是邮件中的 HTML 内容的原因。

      因此,在这里要学习的最重要的事情是确保我们不会错过任何微小的事情,也不要认为我们做的一切都是正确的。就我而言,最好将工作 URL 复制粘贴到 cron 文件中。

      【讨论】:

        【解决方案7】:

        一种简单且安全(无 tmp 文件)的方法是使用 bash 的进程替换:

        * * * * * bash -c "/path/to/php <(/usr/bin/wget -O - -q -t 1 http://project/cron/tutor_activities.php)"
        

        进程替换在&lt;() 中运行命令并将输出放入一个文件对象中,该文件对象仅在当前进程中可见。为了从 cron 中使用它,直接调用 bash 并将其作为命令字符串传递。

        正如其他人所提到的,使用 php 的完整路径,您可以通过 which php 找到它。

        【讨论】:

          猜你喜欢
          • 2019-05-13
          • 1970-01-01
          • 2021-12-15
          • 1970-01-01
          • 1970-01-01
          • 2016-04-28
          • 1970-01-01
          • 2023-03-08
          • 1970-01-01
          相关资源
          最近更新 更多