【问题标题】:Execute php in crontab在crontab中执行php
【发布时间】:2015-05-25 07:02:49
【问题描述】:

我有一个 usr/local/bin/test.sh 文件:

#!/bin/bash
rm -f /tmp/stat/top-1m.csv.zip
wget -P /tmp/stat/ http://s3.amazonaws.com/alexa-static/top-1m.csv.zip
rm -f /tmp/stat/top-1m.csv
unzip -d /tmp/stat/ /tmp/stat/top-1m.csv.zip
php test.php /tmp/stat/top-1m.csv

我正在尝试使用 crontab 在服务器上运行它。 /etc/crontab 中的代码:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/tmp/stat
MAILTO=root
HOME=/

25 12 * * * root /usr/local/bin/test.sh

.zipped 文件被下载并解压缩(非常缓慢,但完成了)。我的 test.php 文件应该从文件中收集数据并将其插入 mysql 数据库。测试。 如果我在终端中执行 test.sh,一切都很好。但是没有任何东西通过 cron 作业写入数据库。为什么是这样?我什至不知道它是否开始运行 test.php。

帮助?

【问题讨论】:

    标签: ubuntu cron server


    【解决方案1】:

    cron 中的 PATH 变量不是您登录时获得的变量。很简单:cron 不会让您(或任何其他用户)登录。

    同样,您在登录时有一个当前目录,这与 root 的 cron 作业将使用的目录不太可能相同。

    最简单和最健壮的解决方案是在所有命令前添加完整路径,例如 php、unzip、wget ... 并 cd 到您需要所在的目录。

    要找出您在登录时执行命令时使用的路径,请使用“which”:

    例如:

    $ which php
    /weird/place/php
    

    意味着您将php test.php /tmp/stat/top-1m.csv 行替换为/weird/place/php test.php /tmp/stat/top-1m.csv,同样,将位置添加到脚本test.php 中。所以你最终会得到类似/weird/place/php /home/user/subdir/test.php /tmp/stat/top-1m.csv

    通常,unix 系统设置为将 cronjobs 的输出通过电子邮件发送给拥有 crontab 的用户。从外观上看,可能是您的根源。检查该电子邮件并尝试将其发送给您,以便您可以查看这些错误并根据需要对其做出反应。

    【讨论】:

      【解决方案2】:

      你应该在 test.sh 中为 test.php 使用绝对路径

      【讨论】:

        【解决方案3】:

        当运行一个 crontab 时,总是建议提供执行程序的完整路径,例如

        /usr/bin/php ...
        

        而不是

        php ...
        

        还有

        full/path/to/test.php
        

        您还应该检查您的 cron 用户是否有权访问该文件。

        【讨论】:

        • 非常感谢。这也是一个正确的答案,但我只能标记一个
        猜你喜欢
        • 2019-05-09
        • 2019-06-06
        • 2011-02-10
        • 1970-01-01
        • 2016-03-02
        • 2016-04-07
        • 2013-09-13
        • 2011-10-14
        • 2023-01-22
        相关资源
        最近更新 更多