如何由哪个用户在 crontab 中指定运行脚本? [关闭]
Posted
技术标签:
【中文标题】如何由哪个用户在 crontab 中指定运行脚本? [关闭]【英文标题】:How to specify in crontab by what user to run script? [closed] 【发布时间】:2012-01-18 12:40:47 【问题描述】:我很少有在 root 下运行的 crontab 作业,但这给我带来了一些问题。例如,在该 cron 作业的过程中创建的所有文件夹都在用户 root 和组 root 下。 我怎样才能让它在用户 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
【问题讨论】:
【参考方案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
【讨论】:
这会让它以 apache 用户身份运行,女巫是 www-data 对吗? 请注意,此方法不适用于crontab -e
,但仅适用于直接编辑/etc/crontab
。阅读此文件顶部的评论以获取更多信息。
用户只能在系统crontab中指定
我在系统 crontab 上按时完成了一些工作。当我做sudo crontab -e
时,我看到了工作。但我打开文件/etc/crontab
没有工作。这很奇怪吗?另外,如果我sudo crontab -e
并添加一个指定用户的工作,它会工作吗?【参考方案2】:
您也可以尝试使用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
【讨论】:
runuser
不包含在 Ubuntu 中。
runuser 是最新版本的 Ubuntu。此答案unix.stackexchange.com/questions/169441/ubuntu-runuser-command 中讨论了 runuser 的替代方法,例如su 和 sudo。【参考方案3】:
由于您运行的是 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
用户可以访问它们。
【讨论】:
我认为这应该等同于crontab -e
;但不是。
Ubuntu 文档建议不要编辑 /etc/crontab,因为它可能被更新覆盖。 crontab -e 将在 /var/spool/cron/crontabs 中创建一个用户特定的 cron 文件。【参考方案4】:
Mike 的建议听起来像是“正确的方式”。我遇到了这个线程想要指定用户在重启时运行vncserver
,并希望将我所有的 cron 作业保存在一个地方。
VNC cron 出现以下错误:
vncserver: The USER environment variable is not set. E.g.:
在我的例子中,我可以使用sudo
来指定以谁的身份运行任务。
@reboot sudo -u [someone] vncserver ...
【讨论】:
我在日志中收到了这条消息:sudo: sorry, you must have a tty to run sudo
@renatoargh 你可能在 RedHat 上运行。看看 Unix.SE 上的this answer。【参考方案5】:
不要创建 crontab 以作为 root 用户运行,而是为要运行脚本的用户创建一个 crontab。在您的情况下,crontab -u www-data -e
将为 www-data 用户编辑 crontab。只需将您的完整命令放在那里,然后将其从 root 用户的 crontab 中删除。
【讨论】:
当您将crontab -e
用作特定用户时,它的工作方式相同。
但是这个 crontab 是在系统启动时检查还是仅在用户登录时检查?
cron
在 *nix 系统上不需要用户登录即可运行特定用户的 crontab 中指定的作业。
这是否也会按照 OP 的要求设置组 ID?如果想要的群组与用户的主要群组不同怎么办?以上是关于如何由哪个用户在 crontab 中指定运行脚本? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章