Linux 管理 Crontab 服务

前言

本文主要介绍如何在 Linux 系统上安装和管理 Crontab 服务,适用于 Debian 9、CentOS 7 系统。

Crontab 安装

Crontab 安装(CentOS 7)

1
# yum instal crontabs

Crontab 安装(Debian 9)

1
# apt-get install cron

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 的使用

命令格式

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 使用格式

crontab-format

  • 第 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 镜像

警告

  1. 这里不建议使用 CentOS 镜像,因为 Docker 的官方 CentOS 镜像中没有提供 systemd 服务,虽然有对应的 解决方案,但解决起来稍微复杂了一点
  2. 如果基于 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 容器

1
# docker-compose up -d

Crontab 命令在线生成工具

参考资料