背景:多个用户的任务分散管理有点不方便,有时候就一两条。所以就都放在了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