在 crontab 中执行 php

Execute php in crontab

我有一个 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。代码 in/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 作业没有任何内容写入数据库。为什么是这样?我什至不知道它是否开始 ezecuting test.php。

帮忙?

您应该在 test.sh

中为 test.php 使用绝对路径

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 的用户。从它的外观来看可能是你的案例的根源。检查该电子邮件并尝试将其发送给您,以便您可以看到这些错误并根据需要做出反应。

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

/usr/bin/php ...

而不是

php ...

full/path/to/test.php

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