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

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

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

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

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

Cron 文件还具有强制的末尾有一个新行。

总结: 我如何才能使用户创建的 cron 作业发挥作用www-data

编辑:1

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

答案1

Cron 将运行 www.data 项目。您可以使用以下简单测试来验证这一点:

$ sudo crontab -u www-data -e

添加此条目:

* * * * * date >> /tmp/date.out

现在使用以下命令检查输出:

$ tail -f /tmp/date.out

完成上述操作后,确保 crontab 正常运行,您就可以运行想要运行的实际脚本了。

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

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

您可以使用以下方式执行此操作:

$ echo $PATH > ~/mypath.txt

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

您的脚本:

#!/bin/bash

export PATH=$PATH:/home/users/l/j/ljames/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
# rest of your script code here.

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

/home/users/l/j/ljames/bin
/usr/games
/usr/local/games
/snap/bin

这将使脚本的路径线保留为:

#!/bin/bash

export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

# ... rest of your script code here

在 cron 中运行的 PHP 脚本

php 测试脚本/home/users/l/j/ljames/test.php

#!/usr/bin/php

<?php
        $string=`date`;
        print "Output from PHP script: $string";
?>

php crontab 条目

* * * * * php /home/users/l/j/ljames/test.php >> /tmp/date.out

您可以使用以下方法检查输出:

$ 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

输出验证 crontab 将运行您的 php 脚本。 这表明罪魁祸首是实际脚本,必须先对其进行调试才能在 cron 之外正常运行。可能的罪魁祸首是环境的路径列表。

笔记:
您的系统与你的网络服务器脚本以用户身份运行将比www-data他们更安全运行方式您或 root。如果他们是您,该脚本将有权访问您有权访问的所有内容,如果您的 Web 服务器受到攻击,它甚至可能具有 root 访问权限sudo。让您的 Web 服务器脚本运行方式 www-data,受感染的服务器将只能访问您的服务器。如果备份了,修复起来会比处理整个服务器更容易。

答案2

这是因为,传统上(出于非常好的安全原因),用户www-data不允许做除 Web 服务之外的任何事情。没有登录,没有 cron 作业,什么都没有。

$ getent passwd www-data
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin

重新考虑你的工作流程,不要试图按照...来运行事情www-data

答案3

我找到了解决方案。我通过输入以下内容检查了 cronlogs

sudo grep CRON /var/log/syslog

我看到了消息“(CRON) info (No MTA installed, discarding output)”

这意味着我必须安装邮件。

所以我跑了sudo apt-get install postfix,现在一切都正常了。

答案4

为了让用户www-data正确运行 cron 作业,此文件需要存在:

/var/spool/cron/crontabs/www-data

具有权限:

-rw------- 1 www-data crontab

这应该可以实现(如上所述):

sudo crontab -u www-data -e...添加您需要的内容。

如果权限不正确,请使用:

sudo chmod 600 /var/spool/cron/crontabs/www-data
sudo chown www-data:crontab /var/spool/cron/crontabs/www-data

直接编辑此文件是不被认可的,即使它可以工作,因为cron它喜欢自我管理。

相关内容