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

Ubuntu 如何在crontab中指定由哪个用户运行脚本?,ubuntu,cron,crontab,Ubuntu,Cron,Crontab,我几乎没有在root下运行的crontab作业,但这给了我一些问题。例如,在cron作业过程中创建的所有文件夹都位于用户根目录和组根目录下。 如何使其在用户www数据和组www数据下运行,以便在从网站运行脚本时可以操作这些文件夹和文件 我的服务器在Ubuntu上运行。 当前的crontab作业是: */1 * * * * php5 /var/www/web/includes/crontab/queue_process.php >> /var/www/web/includes/cron

我几乎没有在root下运行的crontab作业,但这给了我一些问题。例如,在cron作业过程中创建的所有文件夹都位于用户根目录和组根目录下。 如何使其在用户www数据和组www数据下运行,以便在从网站运行脚本时可以操作这些文件夹和文件

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

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

编辑:请注意,此方法不适用于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

与其创建一个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

,这将使其作为apache用户运行,即www-data-right?请注意,此方法不适用于
crontab-e
,但仅当您直接编辑
/etc/crontab
时才有效。有关详细信息,请阅读此文件顶部的注释。只能在系统crontab中指定用户。我在系统crontab上有几个作业按计划进行。当我执行
sudo crontab-e
时,我看到了作业。但是我打开文件
/etc/crontab
没有作业。这奇怪吗?另外,如果我
sudo crontab-e
并添加一个用户指定的作业,它会工作吗?我认为这应该相当于
crontab-e
;但不是。Ubuntu文档建议不要编辑/etc/crontab,因为它可能被更新覆盖。crontab-e将在/var/spool/cron/crontab中创建一个特定于用户的cron文件。当您以特定用户身份使用
crontab-e
时,它的工作方式相同。但是,该crontab是在系统启动时检查还是仅在用户登录时检查?
cron
on*nix系统不需要用户登录即可运行在特定用户的crontab。这是否也会将组id设置为OP要求的组id?如果用户想要的组与用户的主组不同,该怎么办?我在日志中看到这样一条消息:
sudo:对不起,您必须有一个tty才能运行sudo
@renatoargh您可能正在运行RedHat。看看Unix.SE上的运行用户。Ubuntu中不包括运行用户。运行用户在最新版本的Ubuntu中。如本回答中所述,还有runuser的替代方案,例如su和sudo。