【问题标题】:How to specify in crontab by what user to run script? [closed]如何由哪个用户在 crontab 中指定运行脚本? [关闭]
【发布时间】: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

【问题讨论】:

    标签: ubuntu cron crontab


    【解决方案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

    【讨论】:

    【解决方案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?如果想要的群组与用户的主要群组不同怎么办?
    猜你喜欢
    • 1970-01-01
    • 2021-08-05
    • 2012-08-14
    • 2018-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    相关资源
    最近更新 更多