Linux 管理 Crontab 服务

前言

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

Crontab 服务安装(CentOS 7)

1
# yum instal crontabs

Crontab 服务安装(Debian 9)

1
# apt-get install cron

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 日志管理(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 任务管理(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用户的权限,同时需要指定以哪个用户来执行计划任务
# echo "0 */2 * * * root /usr/bin/python3 /usr/share/python_scripts/mysql-sync.py" >> /etc/crontab

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
# 命令格式
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed

# 每5秒执行一次
0/5 * * * * /sbin/reboot

# 每一小时执行一次
0 */1 * * * /sbin/reboot

# 每天6点执行一次
0 6 * * * /sbin/reboot

# 每天7:50执行一次
50 7 * * * /sbin/reboot

# 每隔45分钟执行一次
*/45 * * * * /sbin/reboot

# 在12月内,每天6点到12点,每隔3个小时0分钟执行一次
0 6-12/3 * 12 * /sbin/reboot

Crontab 的 Docker 使用

用于构建 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

参考资料