如何在 crontab 中指定由哪个用户运行脚本?

在根目录下运行的 crontab 作业很少,但这给我带来了一些问题。例如,在 cron 作业过程中创建的所有文件夹都位于用户根目录和组根目录下。 我怎样才能使它运行下用户 www-data 和组 www-data,以便当我运行脚本从我的网站,我可以操纵这些文件夹和文件?

我的服务器在 Ubuntu 上运行。
目前 crontab 的工作是:

*/1 * * * * php5 /var/www/web/includes/crontab/queue_process.php >> /var/www/web/includes/crontab/queue.log 2>&1
278738 次浏览

编辑: 注意,这个方法不适用于 crontab-e,但只适用于直接编辑/etc/crontab 的情况。否则,您可能会得到类似 /bin/sh: www-data: command not found的错误

就在节目名称之前:

*/1 * * * * www-data php5 /var/www/web/includes/crontab/queue_process.php >> /var/www/web/includes/crontab/queue.log 2>&1

不要创建作为 root 用户运行的 crontab,而是为要运行脚本的用户创建 crontab。在您的示例中,crontab -u www-data -e将为 www-data 用户编辑 crontab。只需将您的完整命令放在那里,并从 root 用户的 crontab 中删除它。

迈克的建议听起来像是“正确的方法”。我碰到这个线程,希望指定用户在重新启动时运行 vncserver,并希望将所有 cron 作业放在一个地方。

对于 VNC cron,我得到了以下错误:

vncserver: The USER environment variable is not set. E.g.:

在我的例子中,我能够使用 sudo来指定以谁的身份运行任务。

@reboot sudo -u [someone] vncserver ...

因为您运行的是 Ubuntu,所以您的系统 crontab 位于 /etc/crontab

作为 root 用户(或者使用 sudo) ,您可以简单地编辑这个文件并指定应该运行这个命令的用户。下面是系统 crontab 中条目的格式以及如何输入命令:

# m h dom mon dow user  command
*/1 * * * * www-data php5 /var/www/web/includes/crontab/queue_process.php >> /var/www/web/includes/crontab/queue.log 2>&1

当然,应该设置 php 脚本和日志文件的权限,以便 www-data用户可以访问它们。

您还可以尝试使用 runuser(作为 root 用户)作为不同的用户运行命令

*/1 * * * * runuser php5 \
--command="/var/www/web/includes/crontab/queue_process.php \
>> /var/www/web/includes/crontab/queue.log 2>&1"

参见: man runuser