在日常中,我们常常需要linux系统来执行定时任务。而这时就需要我们使用crontab命令来完成此项任务。

crontab 命令介绍

crontab命令被用于提交和管理用户提交的需要定期执行的任务。而crontab命令需要crond服务支持。crondLinux下用来周期地执行某种任务或等待处理某些事件的一个守护进程。在安装linux系统时,crond一般会被自动安装。我们可以通过如下的命令查看、启动、重启crond服务。

1
2
3
$ service crond status # 查看crond状态
$ service crond start # 启动crond服务
$ service crond restart # 重启crond服务

crontab 语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Usage:
crontab [options] file
crontab [options]
crontab -n [hostname]

Options:
-u <user> define user
# 用来设定某个用户的 crontab 服务,例如 "-u demo" 表示设备 demo用户的 crontab 服务,此选项一般有 root 用户来运行。
-e edit user's crontab 、
# 编辑某个用户的 crontab 文件内容。如果不指定用户,则表示编辑当前用户的 crontab 文件。
-l list user's crontab
# 显示某用户的 crontab 文件内容,如果不指定用户,则表示显示当前用户的 crontab 文件内容。
-r delete user's crontab
# 从 /var/spool/cron 删除某用户的 crontab 文件,如果不指定用户,则默认删除当前用户的 crontab 文件。
-i prompt before deleting
# 在删除用户的 crontab 文件时,给确认提示。
-n <host> set host in cluster to run users' crontabs
-c get host in cluster to run users' crontabs
-s selinux context
-x <mask> enable debugging

注意:这里的 file 指的是包含待执行任务的crontab文件。

任务的定义

crontab文件的含义:用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:

minute hour day month week command

其中:

  • minute: 表示分钟,可以是从0到59之间的任何整数。
  • hour:表示小时,可以是从0到23之间的任何整数。
  • day:表示日期,可以是从1到31之间的任何整数。
  • month:表示月份,可以是从1到12之间的任何整数。
  • week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
  • command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。

在以上各个字段中,还可以使用以下特殊字符:

  • 星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。

  • 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”

  • 中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”

  • 正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。

注意:在定义任务时,我们可以分别以周或者是日月为单位作为循环,但我们不可使用 几月几号且为星期几 的模式工作。

下面的例子是一个错误的写法:

1
30 12 11 9 5 root echo "test mission" 

设置定时任务

我们可以如下的几种方式进行定时任务的设置。

  • 用户定时任务:使用crontab -e命令

用户定时任务:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。

我们可以使用crontab -e进入某个用户的定时任务编辑界面。如果不指定用户的话,则进入当

前用户的编辑界面。在编辑界面中,一行表示一个定时任务。如下图所示,编辑界面含有两个定时任务。

屏幕截图 2021-03-03 155633

  • 系统定时任务:编辑/etc/crontab文件

系统定时任务:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。

首先,我们先来看看文件的内容。使用cat /etc/crontab,内容如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO= root
HOME=/
# 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
51 * * * * root run-parts /etc/cron.hourly
24 7 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

前面四行是用来配置crond任务运行的环境。

第一行:指定了环境所使用的shell。

第二行:指定了系统执行命令的路径。

第三行:指定了crond的任务执行信息将通过电子邮件发送的用户,这里发给root用户。如果为空,则不发给任何人。

第四行:指定了执行命令或者脚本时的主目录。

下面的几行,则是系统执行的任务。每个任务占据一行。

注意:在这里定义任务时,需要指定用户。而用户任务则不需要。

crontab 相关配置文件

  • 用户权限文件
1
2
\etc\cron.deny
\etc\cron.allow

使用说明:

  1. 当系统中有 /etc/cron.allow 文件时,只有写入此文件的用户可以使用 crontab 命令,没有写入的用户不能使用 crontab 命令。同样,如果有此文件,/etc/cron.deny 文件会被忽略,因为 /etc/cron.allow 文件的优先级更高。

  2. 当系统中只有/etc/cron.deny文件时,写入此文件的用户不能使用 crontab 命令,没有写入文件的用户可以使用 crontab 命令。

  3. Linux 系统中默认只有/etc/cron.deny 文件。

  • 用户任务存放目录
1
/etc/spool/cron/

说明:所有用户crontab文件存放的目录,以用户名命名。

  • cron.daily cron.hourlycron.weeklycron.monthly目录
1
2
3
4
/etc/cron.daily/
/etc/cron.hourly/
/etc/cron.weekly/
/etc/cron.monthly/

说明:在四个文件夹里面存放了crond按天、小时、周和月执行的脚本。

解释:

看一下 anacrontab 这个配置文件中的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22
#period in days delay in minutes job-identifier command
1 5 cron.daily nice run-parts /etc/cron.daily
7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly

在系统启动时会读取一次 anacrontab 中的配置参数。

这里以每天举例。在读取完成 anacrontab 文件后,crond 程序会在每天的 4点12分 左右执行一次 cron.daily 下的文件。

参考