crontab使用指定用户执行定时任务

背景:多个用户的任务分散管理有点不方便,有时候就一两条。所以就都放在了root用户下。

分散管理

分散管理可以直接 crontab -u jeeinn -e 来进行编写,相当于在 jeeinn 这个用户下新建并使用了 crontab 任务。

集中管理

直接使用 root 的定时任务编辑。

# 可登录用户
* * * * * jeeinn sh /data/some_task.sh

# 非登录用户如 www 需指定 shell 执行
* * * * * su www -s /bin/bash -c "sh /data/some_task.sh"

特殊情况的写法

  • 定时任务中按日期生成日志【注意日期格式的转义】
  • 非登录用户需指定 shell,否则任务无法执行
  • 非登录用户指定 shell 后需使用 -c (command) 参数来执行任务命令,否则任务命令无法执行
#可以后台执行的进程
* * * * * su www -s /bin/bash -c "cd /data/task && /usr/local/php7/bin/php task.php >> log-$(date +'\%Y\%m\%d').log 2>&1 &"

附:在外部指定用户执行docker中的定时任务

  • 指定 docker 内用户使用 –user 参数
  • 使用 -i 参数而非 -i -t,定时任务不能交互
  • 注意容器内 shell 环境,有的没有 /bin/bash ,仅支持 /bin/sh
  • 自定义日志路径时需在与 -c 参数 平行使用,写在 -c 参数里时,日志会生成在容器内部(视自己应用情况而定)
# docker指定用户执行定时任务
* * * * * docker exec -i --user www-data container_name_php /bin/sh -c "cd /www/test/ && php think task"  >> /var/log/test/task.log
Author: thinkwei

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注