我有 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
它喜欢自我管理。