为什么 WWW-DATA 创建的 cron 任务没有运行?

Uma*_*yub 2 cron 14.04

我有 Ubuntu 14,想使用我的 PHP 代码创建一些 cron 作业。

目前,我正在做类似的事情crontab -u www-data,并且可以从我的 PHP 代码写入 crontab。

如果我这样做,crontab -u www-data -e我可以看到有一些命令,但这些命令没有被执行,但如果我将相同的命令添加到crontab -e(不指定用户),它们会成功运行。

Cron 文件的末尾也有MANDATORY换行符。

TL;DR: 如何让用户创建的 cron 作业www-data工作?

编辑:1

解决方案: 点击查看解决方案

L. *_*mes 7

Cron 将运行 www.data 项目。您可以通过这个简单的测试来验证这一点:

$ sudo crontab -u www-data -e
Run Code Online (Sandbox Code Playgroud)

添加此条目:

* * * * * date >> /tmp/date.out
Run Code Online (Sandbox Code Playgroud)

现在检查输出:

$ tail -f /tmp/date.out
Run Code Online (Sandbox Code Playgroud)

完成此操作以确保您的 crontab 正常工作后,您可以使用要运行的实际脚本。

用户www-data虽然与您的路径不同,因此www-data除非您专门为该脚本设置路径,否则许多在您的帐户中运行的命令将无法在用户中运行。www-data 的默认路径仅包含:PATH=/usr/bin:/bin

您可以通过导出路径列表,然后将其放置在脚本的路径列表中来执行此操作。

你可以这样做:

$ echo $PATH > ~/mypath.txt
Run Code Online (Sandbox Code Playgroud)

现在将 ~/mypath.txt 的文本附加到脚本的顶部,如下所示:

你的脚本:

$ sudo crontab -u www-data -e
Run Code Online (Sandbox Code Playgroud)

您可以通过删除一些您不会使用的明显项目来微调路径,例如在我的示例中:

/home/users/l/j/ljames/bin
/usr/games
/usr/local/games
/snap/bin
Run Code Online (Sandbox Code Playgroud)

这将使脚本的路径行与:

* * * * * date >> /tmp/date.out
Run Code Online (Sandbox Code Playgroud)

PHP script run in cron

The php test script (/home/users/l/j/ljames/test.php)

$ tail -f /tmp/date.out
Run Code Online (Sandbox Code Playgroud)

The php crontab entry

* * * * * php /home/users/l/j/ljames/test.php >> /tmp/date.out
Run Code Online (Sandbox Code Playgroud)

You can examine the output with:

$ tail -f /tmp/date.out
Output from PHP script: Fri Feb  3 14:46:01 EST 2017

Output from PHP script: Fri Feb  3 14:47:01 EST 2017

Output from PHP script: Fri Feb  3 14:48:01 EST 2017
Run Code Online (Sandbox Code Playgroud)

The output verifies that crontab will run your php scripts. It shows that the culprit is the actual script, which would have to be debugged to function properly outside of cron first. The likely culprit would the path list of the environment.

注意:
您或 root身份运行www-data相比,以用户身份运行的带有 Web 服务器脚本的系统会更安全。如果他们像您一样,脚本将可以访问您有权访问的所有内容,并且如果您的 Web 服务器受到威胁,它甚至可能具有 .root 访问权限。让您的 Web 服务器脚本run-as,受感染的服务器将只能访问您的服务器。哪个,如果备份,将比必须处理整个服务器更容易修复。sudo www-data