如何将crontab以用户www-data身份运行?

我的LAMP设置为以"user:www-data"的身份工作,并且所有文件和文件夹都使用该权限创建。
我已经为crontab设置了user@ubuntu。
所以我执行"crontab -e"并使用此命令:
*/5 * * * * php /var/www/public/voto_m/artisan top >/dev/null 2>&1

基本上,该命令只是在指定的位置创建缓存文件(这没有问题),但是该缓存文件是使用用户:用户权限而不是用户:www-data权限创建的。
我如何使其默认以用户:www-data权限创建文件? 每次重新创建文件时,我都不能去执行chown命令。
谢谢。

请注意,一些以 www-data 用户身份运行的 crontab 脚本(例如 awstatsphp5 sessionclean)位于 /etc/cron.* 目录中,因此在使用 crontab -e 命令时无法看到(即使指定了用户 www-data)。 - Skippy le Grand Gourou
5个回答

你还可以使用-u参数运行crontab来编辑特定用户的crontab:
sudo crontab -u www-data -e

这适用于14.04版本。 - dgoosens
这正是我们所需要的。CODE COMMANDER!哈哈,喜欢那个名字,Ubu 18.04。 - undefined

您可以将条目写入系统crontab /etc/crontab,它需要一个额外的参数来指定要作为运行用户(通常是root,但也可以是www-data)。

您的行应为:

*/5 * * * * www-data php /var/www/public/voto_m/artisan top >/dev/null 2>&1

或者您可以使用su编辑用户www-data的cron表:

sudo su -c "crontab -e" www-data -s /bin/bash

2实际上,在大多数Ubuntu版本上,第二个选项不起作用。 - Ruslan
第二个选项在12.04LTS上对我起作用。也许在后续版本上不行? - mivk
1第二个选项在14.04版本上无法正常工作。 - dgoosens
为了方便管理,该行也可以放在自己的文件中,位于/etc/cron.d目录下,并使用一个描述性的名称,例如/etc/cron.d/artisan - fkraiem
3对于第二个选项,请尝试使用以下命令:sudo su -c "crontab -e" www-data -s /bin/bash - Lunfel
第二个选项应该避免使用,原因如下:
  1. 默认情况下,www-data用户没有shell。
  2. 与第一点相对应,这种方法往往会隐藏cron job,因为通常不期望www-data用户处理cron jobs。
- Aldee
作为超级用户,您可以只需执行“crontab -u www-data -e”而无需担心Shell的奇怪问题。以这种方式进行操作的一个优点是可以确保作业完全在该用户的权限范围内运行,这样在使用“/etc/cron*”下的内容时就不会意外地以超级用户权限运行某些东西。 - CR.

要以用户www-data运行crontab,您可以使用以下命令:

crontab -u www-data -e

然后你写一行代码,例如每15分钟运行一个php文件:
*/15  *  *  *  * php -f /path_to_cron/cron.php

保存时,编辑器会询问您:
File Name to Write: /tmp/crontab.HMpG7V 

不用担心,把它保存在那里就可以了。`crontab -e`会打开一个位于/tmp目录下的文件,而不是实际的crontab文件,它可以检查你的新crontab是否有错误,并防止你用这些错误覆盖你的实际crontab。如果没有错误,你的实际crontab将被更新。如果crontab -e直接写入你的实际crontab,那么你可能会丢失整个crontab的内容。
为了验证你的定时任务是否运行,你可以检查cron日志,通常在/var/log/cron.log中,或执行以下命令:
crontab -u www-data -l

这个在Ubuntu上对我有效。 - tristanbailey
这个问题之前已经由上面的代码指挥官正确而简洁地回答过了,大约是在4年前。你忽略了使用"sudo"命令,并且额外提供了关于cron行格式的无关信息。 - RichieHH

我想提出另一种方法。正如其他人所提到的,Ubuntu(这里是16.04版本)和www-data crontab似乎不可靠(也许是出于安全考虑?)。
无论如何,在我们公司,我们喜欢将所有cron作业放在一个服务器上,以便轻松访问,这样就不会漏掉任何东西。同时,我们不希望将所有事情(实际上任何事情!)都以root身份运行。
因此,我们运行
sudo crontab -e 

像平常一样,然后我们指定命令为
* * * * * /bin/su - www-data -s /bin/bash -c '/path/to/command'

这将以www-data身份执行/path/to/command,同时保留在root cronjobs文件中的cron作业(这样将始终正确运行)。它的好处是可以使用管道以root身份编写日志文件(以获得最大安全性)。
请注意,我们正在传递我们首选的shell,这也可以是/bin/sh,用于更简单的shell(我们只喜欢完整的bash功能)。Www-data没有指定shell,因此如果没有它,您将会收到错误。通常,cron仅使用/bin/sh运行作业。

重要提示:www-data用户没有执行权限。
因此,您需要使用su命令并添加-s选项以使用shell作为www-data用户运行命令。
Laravel示例:
    * * * * * su www-data -s /bin/bash -c "/path_your_project/artisan schedule:run"