前言
本文主要介绍如何在 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 命令在线生成工具
参考资料