RHEL7中的CRON简介

本文最后更新于:July 10, 2019 am

RHEL7中的CRON功能以及使用方式简介。

1、cron简介

crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务 工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。

注意Cron在设置定时任务的时候,最多只能精确到分钟而无法精确到秒。

Linux下的任务调度分为两类,系统任务调度和用户任务调度。

  • 系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。**/etc/crontab文件是系统任务调度的配置文件。**

  • 用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab 文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致。

2、cron安装

1
2
# cron的安装进程是cronie
yum install -y cronie

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 设置cron开机启动
systemctl enable crond.service

# 关闭cron开机启动
systemctl disable crond.service

# 启动cron
systemctl start crond.service

# 查看cron运行状态
systemctl status crond.service

# 重启cron
systemctl restart crond.service

# 关闭cron
systemctl stop crond.service

3、cron相关文件

我们先看一下在/etc目录下和cron相关的文件主要有哪些,接下来我们逐个对其进行分析。

3.1 /etc/crontab

我们cat一下/etc/crontab这个文件看看里面的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 使用哪种she11接口
SHELL=/bin/bash
# 执行文件搜寻路径
PATH=/sbin:/bin:/usr/sbin:/usr/bin
# 若有额外STDOUT,以email将数据送给谁
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- 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
  • MAILTO=root:这个项目是说,当/etc/crontab这个文件中的例行性工作的指令发生错误时,或者是该工作的执行结果有STDOUT/STDERR时,默认是由系统直接寄发一封mail给root。由于root 并无法在客户端中以POP3之类的协议接收邮件,因此你也可以改成自己的邮箱。
  • PATH:这里就是输入执行文件的搜寻路径,一般使用默认的路径即可
  • 分-时-日-月-周-执行用户-执行指令:七个字段的设定,这个/etc/crontab里面可以设定的基本语法就在这个文件里面,当我们忘了格式的时候可以cat这个文件看一下,需要注意的是不填写的字段需要使用星号*来占位,同一个字段要写多个数字的时候用英文逗号隔开;执行用户方面,系统默认是以root的身份来进行的。

这里需要注意的是,在设定时间的时候,不能同时使用周和日月,即我们只能设定该任务在周几执行或者是几月几日执行,不能同时满足这两个条件,否则系统可能会无法正确识别。

3.2 /etc/cron.allow和/etc/cron.deny

/etc/cron.allow/etc/cron.deny这两个文件主要是对使用cron的用户进行管理。

这里可以分为四种情况。

  1. 如果这两个文件都不存在,那么就只有root用户能够使用crontab命令
  2. 如果只存在cron.allow,那么就只有cron.allow上面的用户使用crontab命令,如果root用户也不在里面,则root用户也不能使用crontab
  3. 如果只存在cron.deny,那么就只有cron.deny上面的用户不能使用crontab命令
  4. 如果两个文件都存在,则列在cron.allow文件中而且没有列在cron.deny中的用户可以使用crontab如果两个文件中都有同一个用户,以cron.allow文件里面是否有该用户为准,如果cron.allow中有该用户,则可以使用crontab命令

crontab命令我们将在本文后面讲解

3.3 /etc/cron.d

/etc/cron.d/ 这个目录用来存放任何要执行的crontab文件或脚本

3.4./etc/cron.*ly/

cron.monthly/ cron.weekly/cron.daily/cron.hourly/这四个目录下面存放的文件会在对应的时间内被执行,如 cron.hourly/里面的文件会在每个小时被执行一次,需要注意的是,这里放置的是直接执行的脚本文件,而不是上述的crontab格式的定时任务描述文件。

3.5 /var/spool/cron/

/var/spool/cron/目录下存放着每个用户自己的crontab文件。

4、crontab命令

语法格式:crontab [参数]

常用参数:

参数 含义
-e 编辑该用户的计时器设置
-l 列出该用户的计时器设置
-r 删除该用户的计时器设置
-u 指定要设定计时器的用户名称
–help 显示帮助信息

参考实例

1
2
3
4
# 使用tinychen用户,每年的1月1日输出HappyNewYear!
crontab -e -u tinychen
# 然后和vim一样的编辑模式,输入下列参数
0 0 1 1 * /bin/echo HappyNewYear! > /dev/pts/0

需要注意的是,和/etc/crontab文件不同,使用crontab命令进入到编辑模式的时候不需要再加执行用户这一参数,默认是使用当前的登录账户,如果需要指定,使用-u参数即可。

此外,crontab中还有几种简化的写法需要我们了解一下

1
2
3
4
5
6
7
*	代表所有的取值范围内的数字

/ 代表每的意思,如/5表示每5个单位

- 代表从某个数字到某个数字

, 分开几个离散的数字

需要注意的是,crontab -r是删除该用户的所有定时任务。

5、小结

  • 个人化的行为使用crontab-e

    如果你是依据个人需求来建立的例行工作排程,建议直接使用crontab-e。这样也能保障你的指令行为不会被大家看到(/etc/crontab是大家都能读取的);

  • 系统维护管理使用vim/etc/crontab

    如果这个例行工作排程是系统的重要工作,为了让自己管理方便,同时容易追踪,建议直接写入/etc/crontab较佳!

  • 自己开发软件使用vim/etc/cron.d/newfile

    如果是想要自己开发软件,那当然最好就是使用全新的配置文件,并且放置于/etc/cron.d/目录内即可。

  • 固定每小时、每日、每周、每天执行的特别工作:

    如果与系统维护有关,还是建议放置到/etc/crontab中来集中管理较好。如果想要偷懒,或者是一定要再某个周期内进行的任务,也可以放置到上面谈到的几个目录中,直接写入指令即可!