前言
 
本文主要介绍如何在 Linux 系统上安装和管理 Crontab 服务,适用于 Debian 9、CentOS 7 系统。
Crontab 安装 Crontab 安装(CentOS 7) Crontab 安装(Debian 9) Crontab 服务管理 Crontab 服务管理(CentOS 7) 1 2 3 4 5 6 7 8 9 10 11 # 启动Crontab服务 # systemctl start crond # 关闭Crontab服务 # systemctl stop crond # 重启Crontab服务 # systemctl restart crond # 查看Crontab服务的运行状态 # systemctl status crond 
Crontab 服务管理(Debian 9) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 # 启动Crontab服务 # service cron start # 关闭Crontab服务 # service cron stop # 重启Crontab服务 # service cron restart # 查看Crontab服务的运行状态 # service cron status # 或者使用以下命令替代 # /etc/init.d/cron stop # /etc/init.d/cron start # /etc/init.d/cron status # /etc/init.d/cron restart 
Crontab 日志管理 Crontab 日志管理(CentOS 7) 1 2 # 查看Crontab的日志信息 # tail -f -n 10 /var/log/cron 
Crontab 日志管理(Debian 9) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 # 安装rsyslog服务 # apt-get install rsyslog # 创建Crontab的日志文件 # touch /var/log/cron.log # 开启Crontab的日志记录 # vim  /etc/rsyslog.conf cron.*  /var/log/cron.log     #取消这行内容的注释即可 # 启动rsyslog服务 # service rsyslog start # 查看Crontab的日志信息 # tail -f -n 10 /var/log/cron.log 
Crontab 任务管理 Crontab 任务管理(CentOS 7) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #  编辑并保存当前用户的计划任务 #  crontab -e #  查看当前用户的所有计划任务 #  crontab -l #  提示:以下通过Vim编辑器更改配置文件的方式,不一定能让新增的Crontab计划任务生效 #  编辑root用户的计划任务(依赖root用户的权限) #  vim /var/spool/cron/root #  查看root用户的计划任务(依赖root用户的权限) #  cat  /var/spool/cron/root#  编辑www用户的计划任务(依赖root或者www用户的权限) #  vim /var/spool/cron/www #  查看www用户的计划任务(依赖root或者www用户的权限) #  cat  /var/spool/cron/www
Crontab 任务管理(Debian 9) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 # 编辑并保存当前用户的计划任务 # crontab -e # 查看当前用户的所有计划任务 # crontab -l # 提示:以下通过Vim编辑器更改配置文件的方式,不一定能让新增的Crontab计划任务生效 # 编辑root用户的计划任务(依赖root用户的权限) # vim /var/spool/cron/crontabs/root # 查看root用户的计划任务(依赖root用户的权限) # cat /var/spool/cron/crontabs/root # 编辑www用户的计划任务(依赖root或者www用户的权限) # vim /var/spool/cron/crontabs/www # 查看www用户的计划任务(依赖root或者www用户的权限) # cat /var/spool/cron/crontabs/www 
Shell 脚本添加 Crontab 计划任务 1 2 # 添加系统级的计划任务,依赖root用户的权限,同时需要指定以哪个用户来执行计划任务,此方法适用于绝大多数的Linux发行版 # echo "0 */2 * * * root /usr/bin/python3 /usr/share/python_scripts/mysql-sync.py" >> /etc/crontab 
Crontab 的使用 命令格式 1 crontab [-u user] file crontab [-u user] [ -e | -l | -r ] 
-u user:用来设置某个用户的 Crontab 服务file:命令文件的名称,表示将 file 作为 Crontab 的任务列表文件并载入 Crontab-e:编辑某个用户的 Crontab 配置文件内容。如果不指定用户,则表示编辑当前用户的 Crontab 配置文件-l:显示某个用户的 Crontab 配置文件内容,如果不指定用户,则表示显示当前用户的 Crontab 配置文件内容-r:从 /var/spool/cron 目录中删除某个用户的 Crontab 配置文件,如果不指定用户,则默认删除当前用户的 Crontab 配置文件 
Crontab 使用格式 
第 1 列:分钟 0~59第 2 列:小时 0~23第 3 列:日 1~31第 4 列:月 1~12第 5 列:星期 0~7 (0 和 7 表示星期天)第 6 列:需要执行的命令 
Crontab 使用案例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 # 每5秒执行一次 0/5 * * * * command # 每一小时执行一次 0 */1 * * * command # 每天6点执行一次 0 6 * * * command # 每天7:50执行一次 50 7 * * * command # 每隔45分钟执行一次 */45 * * * * command # 在12月内,每天6点到12点,每隔3个小时0分钟执行一次 0 6-12/3 * 12 * command # 每小时的第3和第15分钟执行 3,15 * * * * command # 在上午8点到11点的第3和第15分钟执行 3,15 8-11 * * * command # 每隔两天的上午8点到11点的第3和第15分钟执行 3,15 8-11 */2  *  * command # 每周一上午8点到11点的第3和第15分钟执行 3,15 8-11 * * 1 command # 每晚的21:30执行 30 21 * * * command # 每月1、10、22日的4:45执行 45 4 1,10,22 * * command # 每周六、周日的01:10执行 10 1 * * 6,0 command # 每天18:00至23:00之间每隔30分钟执行 0,30 18-23 * * * command # 每星期六的晚上23:00执行 0 23 * * 6 command # 晚上11点到早上7点之间,每隔一小时执行 0 23-7 * * * command 
Docker 构建 Crontab 镜像 警告
这里不建议使用 CentOS 镜像,因为 Docker 的官方 CentOS 镜像中没有提供 systemd 服务,虽然有对应的 解决方案 ,但解决起来稍微复杂了一点 
如果基于 CentOS 镜像构建 Crontab 镜像,启动容器时往往会出现错误信息: Failed to get D-Bus connection: Operation not permitted,更多资料可参考 这里  
 
用于构建 Crontab 镜像的 Dockerfile 的内容如下,基于 Debian 9(Stretch)系统
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 from augurproject/python2-and-3 MAINTAINER clay<clay@gmail.com> RUN touch /var/log/cron.log RUN mkdir -p /usr/share/python_scripts ENV workpath /usr/share/python_scripts WORKDIR $workpath RUN echo "Asia/Shanghai" > /etc/timezone RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime RUN cp /etc/apt/sources.list /etc/apt/backup.sources.list RUN echo "deb http://mirrors.163.com/debian/ stretch main non-free contrib" > /etc/apt/sources.list RUN echo "deb http://mirrors.163.com/debian/ stretch-updates main non-free contrib" >> /etc/apt/sources.list RUN echo "deb http://mirrors.163.com/debian/ stretch-backports main non-free contrib" >> /etc/apt/sources.list RUN echo "deb-src http://mirrors.163.com/debian/ stretch main non-free contrib" >> /etc/apt/sources.list RUN echo "deb-src http://mirrors.163.com/debian/ stretch-updates main non-free contrib" >> /etc/apt/sources.list RUN echo "deb-src http://mirrors.163.com/debian/ stretch-backports main non-free contrib" >> /etc/apt/sources.list RUN echo "deb http://mirrors.163.com/debian-security/ stretch/updates main non-free contrib" >> /etc/apt/sources.list RUN echo "deb-src http://mirrors.163.com/debian-security/ stretch/updates main non-free contrib" >> /etc/apt/sources.list RUN apt-get -y update && apt-get -y upgrade RUN apt-get -y install cron rsyslog apt-utils net-tools telnet wget curl vim RUN apt-get -y autoclean && apt-get -y autoremove RUN sed -i "s/#cron./cron./g" /etc/rsyslog.conf RUN echo "0 */2 * * * root /usr/bin/python3 /usr/share/python_scripts/mysql-sync.py" >> /etc/crontab RUN echo "59 23 * * * root /usr/bin/python2 /usr/share/python_scripts/mysql-check.py" >> /etc/crontab CMD service rsyslog start && service cron start && tail -f -n 20 /var/log/cron.log 
将上面的内容保存到 Dockerfile-Crontab 文件中,然后使用以下命令构建 Crontab 镜像
1 # docker build -f Dockerfile-Crontab -t clay/crontab:1.0 . 
使用 Docker-Compose 来管理 Crontab 镜像,其中 Docker-Compose 的配置文件内容如下
1 2 3 4 5 6 7 8 9 10 version: "3.5" services:     crontab:       image: clay/crontab:1.0       container_name: crontab       volumes:         - /usr/local/python_scripts:/usr/share/python_scripts       restart: always       network_mode: bridge 
创建并后台启动 Crontab 容器
Crontab 命令在线生成工具 
参考资料