如何由哪个用户在 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 中指定运行脚本? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Devenv 中指定发布版本?

如何在mysql中定时清除所有库中指定的表中的数据,而不用每个库都写一遍定时任务,求大神指点!!!

如何在 VBScript 中指定“以最高权限运行”?

在Windows 7中指定时间后运行脚本

如何在 Fastlane 的命令行中指定用户名?

如何在 web.config 中指定根 (/) 位置?