Linux操作系统(十二):计划任务
- 什么是计划任务
- 仅执行一次的计划任务
- 循环执行的计划任务
- 可唤醒停机期间的工作任务
一、关于本文内容的导读及什么是计划任务
这部分不涉及具体内容的解析,只是作为浏览和查找相关知识点的引导内容,采用【主题 | 命令 | 对应内容小节编号】三个关键信息的组合模式,依照这些信息可以快速查找到相关详细的示例和解析。
所 谓计划任务就是通过系统的at和cron服务自动在某个时刻执行的任务,而不需要手动去执行命令实现的任务。at服务处理的计划任务只会执行一次,任务被 执行以后就不会在执行;而cron服务处理的是重复多次执行的计划任务,可以按照分钟、小时、周、月、年来周期性调用任务。
CentOS Linux系统上常见的例行性工作即计划任务有:日志文件轮询、日志文件分析、建立locate的数据库、建立manpage查询数据库、建立RPM软件日志文件、删除缓存、与网络服务有关的分析操作等。
关 于计划任务的内容包括计划任务的服务启停、计划任务的设置与管理、计划任务相关权限管理。服务的启停属于服务管理部分的内容,这篇博客仅介绍计划任务的相 关服务的启停;计划任务的设置与管理及权限管理可以通过相关的命令和配置文件来设置管理,详细内容见下文,下面是列举计划任务相关内容主题和相关命令的阅 读引导内容:
二、仅执行一次的计划任务:at
2.1atd的启动与at运行的方式
atd是at即仅执行一次的计划任务的服务,下面来看查看atd的状态:
systemctl status atd #查看atd的状态
atd.service - Job spooling tools
Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled) #这里打印了加载服务的程序路径,以及当前状态为启用、产商预设为启用;
Active: active (running) since 五 2022-09-02 21:50:04 CST; 8min ago #这里表示服务在... 21:50:04这个时间的八分钟前开始运行;
Main PID: 1366 (atd) #这里表示的是atd服务的进程唯一标识即ID
Tasks: 1
CGroup: /system.slice/atd.service
└─1366 /usr/sbin/atd -f #可以通过/usr/sbin/atd -f在前台执行atd的计划任务
9月 02 21:50:04 localhost.localdomain systemd[1]: Started Job spooling tools. #这里表示在这个时间点服务是以启动状态;
如果服务的状态不是启动的话,可以通过下面的命令启动或设置开机启动atd:
systemctl restart atd #重新启动atd这个服务
systemctl enable atd #设置atd这个服务为开机启动
2.2at的运行方式
仅执行一次的计划任务通过at这个命令来产生所要运行的任务, 并将这个任务以文本文件的方式写入/var/spool/at/目录内,任务便能等待atd这个服务的使用与执行。因为计划任务不需要手动运行,这种方式 是骇客程序的最爱,所以不是任何账号都有使用at的权限,当然管理员账户root不在权限限制管理的范围内。除了root以外的用户通过/etc /at.allow和/etc/at.deny这两个配置文件来实现管理用户的at权限,被添加到at.allow的用户是表示该用户可以使用at,而被 添加到at.deny的用户是表示该用户不可以使用at。
管理仅执行一次的计划任务的命令有:at、batch、atq、atrm,下面先来看看这些命令的语法:
at [-qmfldvV] TIME
at -c 任务号码
先来看每个命令的说明:
at、batch:从标准输入或一个指定的文件读取命令,这些命令在以后的某个时间使用bin/sh执行;
at:在指定的时间执行命令;
atq:列出用户的等待执行的任务,如果是超级用户则列出所有用户的任务;
atrm:删除任务;
batch:在系统负载水平允许的时候执行任务,意思就是当平均负载低于0.8或降到低于文件中指定的期望值是执行任务;
at的选项及参数解析:
-q queue:使用指定队列;
-m:当at的任务完成后,即使没有输出信息,也发邮件通知使用者该任务已完成。
-f:从文件读取任务信息而不是交互式的从标准输入;
-l:相当于atq,列出系统上所有该用户待执行的at计划;
-d:相当于atrm,删除任务;
-v:使用较明显的时间格式列出at计划中的任务;
-c:列出后面接的该项任务的实际命令内容;
TIME:时间格式,可以定义的时间格式有:HH:MM、HH:MM YYYY-MM-DD、HH:MM[am|pm] [Month] [Date]、HH:MM[am|pm] + number [minutes|hours|days|weeks]
通过一些示例来解析at的选项和参数的使用:
at now+5 minutes
at> /bin/mail -s "testing at job" root < /root/.bashrc
at> <EOT> #==>这里输入【ctrl】+d,表示结束当前作业
job 1 at Sun sep 4 23:43:00 2022 #==>这里表示刚刚编辑的at作业任务编号为1,添加时间为2022年9月4日23:43:00
at 是一个交互式命令,第一行表示要编辑的作业在什么时候执行,示例中的now+5 minutes表示当前时间的5分钟后执行这个作业;回车以后正式进入编辑作业的具体任务,一个作业可以包括多个任务,每一行编辑一个任务,命令最好使用 工具的完整路径名称(为什么要这么写的原因后面解析);作业编辑完以后使用【chrl】+d快捷键提交作业结束编辑,编辑完以后会打印出作业的基本信息, 包括作业的编号和添加的时间。
一般情况下会将一个at包含的所有任务描述为一个作业或工作,具体要执行的命令就是任务,一个作业可以包括多个任务。
当 at任务执行以后会向任务所有者,即添加任务的用户发送邮件。上面执行的任务是向root发送一个邮件,所以5分钟以后任务所有者和root都会收到邮 件,可以通过mail命令查看邮件这里就不演示了,也就是说at默认启用-m选项的任务完成邮件通知功能,所以感觉-m选项有点多余。
当at任务还没执行时可以通过at -l或atq查看待执行的任务:
at -l #打印信息:1 Mon sep 4 23:43:00 2022 a tx
atq #打印信息:1 Mon sep 4 23:43:00 2022 a tx
需要注意at -l或atq普通用户只能查看自己的任务,root可以查看所有用户的任务,在root用户情况下可以通过 at -l UserName 来查看指定的用户任务,普通用户可以通过任务编号来查看指定的任务信息 at -l [job-id] ,同样管理员也可以通过 at -l UserName [job-id] 来看指定用户的指定任务信息。
使 用at的-q选项要指定任务队列,任务队列的取值范围[a-zA-Z],队列的取值决定任务的运行级别,简单的来说就是决定当在同一时间要指定多个任务时 如果都在一个队列就按照编号的顺序执行;如果在不同队列优先按照队列的优先级别,在一个队列中的同一个时间再按照编号顺序执行。队列优先级别从a到Z依次 降级,也就是说a队列的优先级别最高最先执行这个队列的任务。使用at添加的任务默认队列是a,使用batch添加的任务默认是b队列,使用at -q指定任务队列可以参考这个示例: at -q b now+5 minutes 。在查看任务信息的时候 1 Mon sep 4 23:43:00 2022 a tx 倒数第二栏的“a”就表示的a队列,第一栏的数值表示的任务的编号即job-id,最后一栏是任务所属用户的用户名称。
使用文件任务数据替代交互式的标准输入添加at任务:
在 前面的示例中使用at添加任务是采用交互式的方式,即回车执行at命令以后会跳转到下一行行输入真正的任务,然后使用【ctrl】+d保存退出任务编辑, 这对于添加一个复杂的任务或要经常临时使用的临时任务来说不是很友好,at还提供了-f选项将写在文件内的一个或多个命令作为任务来生成作业,文件内每一 行写一个命令相当于交互模式跳转下一行添加多个任务,下面来看示例:
vim at.tasks #下面是文件的具体数据内容
cat /etc/inittab
echo "hello at command"
at -f at.tasks now+5 minutes #将文件中定义的具体命令作为at任务生成作业
前面的示例详细的介绍了如何添加at任务,at任务都需要等到指定的时间才会执行,也就是说这些任务肯定被存储在特定的文件中等待atd服务使用,在at命令中提供了一个-c选项,可以来查看指定的任务详细信息,下面就来看看刚刚使用-f添加的这个任务:
at -c 13 #我这里测试的作业编号是13,可能你的测试作业编号与我的不一样,查看看你刚刚添加的作业后打印的信息就可以了
#执行命令以后你可以看到下面这样的内容==>
#!/bin/sh
# atrun uid=1000 gid=1000
.....
cat /etc/inittab #在内容的最后面可以看到添加的任务命令
echo "hello at command"
通 过打印的信息来看就很明显可以看得出来这是一个shell的脚本,也就是说at添加的作业回生成一个脚本文件,在这个脚本文件中自动生产了大量的变量等脚 本内容,需要注意的是这个脚本中的PATH变量可能与我们的系统目录并不一致,不知道你是否注意到我在第一个示例中的命令使用完整的工具路径名 称 /bin/mail -s "testing at job" root < /root/.bashrc ,就是为了避免由于PATH不一致导致任务执行失败,所以建议在实际工作中也使用命令的完整路径名称。
在前面的命令介绍中,还可以使用batch来添加任务,batch添加的任务是在系统空闲的时候自动执行,也就是说它不需要指定执行时间,并且batch添加的任务默认是在b队列中,这里就不演示了。
关于at命令最后就是-d选项,它是用来删除任务的,与atrm命令的功能一致,在-d选项后面输入要删除任务编号[job-id]即可删除指定的任务,而且只能删除指定的任务,不输入[job-id]执行会报错,root也一样。
一开始就说过at添加一个作业就会在/var/spool/at/下生成一个文本文件,更准确的说是一个shell脚本,脚本名由at添加任务时自动生成,当作业被执行以后就会删除对应的脚本,所以我们可以通过 ll /var/spool/at/ 查看到当前系统上待执行的作业脚本信息。根据作业名称可以使用 cat /var/spool/at/[atname] 查看对应脚本的完整内容,跟 at -c [job-id] 查看的内容一致。
最 后就是关于atd任务的用户权限,可以使用root身份编辑/etc/at.allow和/etc/at.deny来管理用户的使用权限,比如我是用 root身份将当前测试的普通用户名添加到/etc/at.deny文件中,然后我再使用at来添加任务就不能成功,比如:
at -f at.tasks now+5 minutes #使用/etc/at.deny配置文件禁止当前测试的用户使用at,执行就报包下面这个提示
You do not have permission to use at. #==>翻译:您没有使用at的权限
但需要注意的是/etc/at.allow的权限优于/etc/at.deny,也就是说当检查到at.allow中已经允许了用户设置at任务,即便at.deny也添加了该用户,依然会允许该用户设置at任务。
三、循环执行的计划任务:crontab
3.1crond的运行方式
crond是cron即循环执行计划任务的服务,在Linux上有非常多的循环执行的计划任务,因此crond一般是默认启动的,同样也可以使用下面的命令来查看crond是否启动:
systemctl status crond #查看crond的状态
crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
Active: active (running) since 日 2022-09-04 23:15:08 CST; 15h ago #==>这里表示服务已经启动
Main PID: 1320 (crond)
Tasks: 1
CGroup: /system.slice/crond.service
└─1320 /usr/sbin/crond -n
所谓循环计划任务就是指在每分钟、小时、天、月、周按照时间设定循环执行的任务,cron同样为了避免安全问题包括两个配置文件来限制 用户使用:/etc/cron.allow允许使用循环任务的用户配置文件、/etc/cron.deny不允许使用循环任务的用户配置文件,通过这两个 配置文件来限制用户使用管理循环任务的crontab命令。
当用户使用arontab建立计划任务以后会在/var/spool/cron 目录下生成一个与用户名同名的文件,这个文件会记录该用户建立所有cron任务,最好不要使用vi或vim等文件编辑器直接编辑这个文件,避免出现语法错 误,也就是说除了使用crontab命令来建立计划任务,是可以使用文件编辑器直接到/var/spool/cron目录下编辑相应的文件来管理cron 任务的,但不建议这么做。实际上crontab命令也是编辑/var/spool/cron目录下的文件,只是crontab进入的编辑模式自带语法检 测,并且对错误的语法编辑提交操作会有相关的提示。
3.2crontab命令的语法、选项、参数
crontab [username] [-l | -e | -r]
crontab命令的选项及参数解析:
-u:只有root才能使用的选项,用于帮助其他用户建立/删除crontab计划任务;
-e:编辑crontab的任务内容;
-l:查看crontab的任务内容;
-r:删除所有crontab的任务内容,如果仅要删除一项使用-e编辑即可;
下面通过一些示例来了解crontab命令的使用:
crontab -e #执行以后会进入一个文本编辑界面
0 12 * * * mail -s "at 12:00" root < /root/.bashrc #==>这是编辑的一个cron任务,编辑结束以后使用【ESC】键进入编辑器的命令模式,然后使用【:wq】写入并退出
#保存刚刚编辑好的任务以后,可以查看/var/spool/cron目录下的文件信息
ll /var/spool/cron #打印信息:-rw-------. 1 root root 51 9月 6 12:31 root ==>这个文件就是刚刚使用crontab -e编辑的任务数据,可以使用cat读取这个文件内容
cat /var/spool/cron/root #打印内容:0 12 * * * mail -s "at 12:00" root < /root/.bashrc
#下面通过-u在root用户下给tx用户添加一个cron任务
crontab -u tx -e #执行以后进入文本编辑界面
0 12 * * * mail -s "at 12:00" tx < /home/tx/.bashrc #===>这是root帮助tx用户编辑一个cron任务
ll /var/spool/cron #打印信息:
-rw-------. 1 root root 51 9月 6 12:31 root
-rw-------. 1 root root 52 9月 6 12:55 tx #这就是刚刚root用户帮助tx用户建立一个cron任务创建的文件
cat /var/spool/vron/tx #打印信息:0 12 * * * mail -s "at 12:00" tx < /home/tx/.bashrc
su tx #切换到tx用户
crontab -e #这里我就不编辑任务了,执行以后会发现打开的文件是/var/spool/vron/tx
通过上面的示例可以了解到crontab会在/var/spool/vron目录下建立对应用户名称的循环任务文本文件,cron任务 除了crontab命令编辑生成的用户名对应的任务配置文件,还有一个可以配置cron任务的文件就是/etc/crontab,这也是一个纯文本配置文 件,可以直接使用文本编辑器进行编辑,下面来看这个文件的初始内容以及编辑新的cron任务的示例:
vim /etc/crontab #打开文件,手动编辑cron任务
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
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 #===>上面这一部分内容是文件的初识化结构
01 * * * * root run-parts /etc/cron.hurly #===> 相比crontab命令添加的任务多了一个用户,因为crontab是基于一个用户创建一个任务配置文件
3.3crond服务的配置文件
在前面的内容中实际上已经介绍了crond服务两个 配置文件的位置,分别是:/etc/crontab、/var/spool/cron/*,一般来说crond默认有3个地方的执行脚本配置文件,还有一 个就是/etc/crond.d/*,这个目录下的配置文件其实与/etc/crontab差不多,文件内会定义一些crond服务执行该配置任务的变量 参数和具体的任务,这些任务都是一些系统循环执行计划任务,有兴趣可以读取这些配置文件看看:
ll /etc/cron.d #查看这个目录下的配置文件信息
-rw-r--r--. 1 root root 128 8月 9 2019 0hourly
-rw-r--r--. 1 root root 108 9月 30 2020 raid-check
-rw-r--r--. 1 root root 459 10月 1 2020 sa-update
-rw-------. 1 root root 235 4月 1 2020 sysstat #===>以上都是一些系统循环执行的计划任务,下面重点来看看0hourly这个配置文件
cat /etc/cron.d/0hourly
# Run the hourly jobs
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
01 * * * * root run-parts /etc/cron.hourly #===>重点来看看这个任务的cron.hourly,这是一个目录
ll /etc/cron.hourly #查看这个目录下的文件
-rwxr-xr-x. 1 root root 392 8月 9 2019 0anacron
-rwxr-xr-x. 1 root root 191 8月 9 2019 mcelog.cron
cat /etc/cron.hourly/0anacron #查看cron.hourly下的文件内容
#!/bin/sh
# Check whether 0anacron was run today already
if test -r /var/spool/anacron/cron.daily; then
day=`cat /var/spool/anacron/cron.daily`
fi
if [ `date +%Y%m%d` = "$day" ]; then
exit 0;
fi
# Do not run jobs when on battery power
if test -x /usr/bin/on_ac_power; then
/usr/bin/on_ac_power >/dev/null 2>&1
if test $? -eq 1; then
exit 0
fi
fi
/usr/sbin/anacron -s #===>通过这个文件内容很明显可以看到这就是一个可执行脚本文件
通过阅读上面的文件内容可以理解其实就是run-parts这个命令会按照周期的时间设定去执行cron.hourly这个目录下的可 执行脚本(可以通过man查看run-parts的说明文档),而run-parts命令实际上就是crontabs可执行文件,它会每小时调用一次(为什么是每小时可以看/etc/cron.d/0hourly内定义的任务 01 * * * * root run-parts /etc/cron.hourly ,后面会详细的介绍cron任务的周期性时间设置就能理解了),而cron.hourly目录下的脚本会被这个可以执行文件在每小时的第一分钟开始后的5分钟内随机选择一个时间来执行这些脚本。
在/etc目录下除了cron.hourly这个每小时周期执行的脚本文件目录,还有一些其他周期脚本文件目录,可以来进一步了解一下:
ll /etc | grep "cron"
-rw-------. 1 root root 541 8月 9 2019 anacrontab
drwxr-xr-x. 2 root root 71 6月 13 00:40 cron.d
drwxr-xr-x. 2 root root 57 6月 13 00:40 cron.daily #==>每天执行一次的周期性任务的目录
-rw-------. 1 root root 0 8月 9 2019 cron.deny
drwxr-xr-x. 2 root root 41 6月 13 00:40 cron.hourly #==>每小时执行一次的周期任务的目录,前面有详细介绍
drwxr-xr-x. 2 root root 6 6月 10 2014 cron.monthly #==>每个月执行一次的周期任务的目录
-rw-r--r--. 1 root root 451 6月 10 2014 crontab
drwxr-xr-x. 2 root root 6 6月 10 2014 cron.weekly #==>每周执行一次的周期性任务的目录
通过对cron的配置文件的了解,可以直到如果需要设置循环计划任务可以有三种方式,分别是:croncat命令、/etc/crontab配置文件、/etc/cron.*固定周期任务目录下添加可执行脚本文件。
以 上详细的介绍了设置循环计划任务的方式,除了在/etc/cron.*下直接添加可执行脚本直接使用shell编程实现之前的相关博客有介绍以 外,croncat命令和/etc/crontab配置文件设置循环计划任务都有特定的语法,下面就来详细的介绍一下定义cron任务的语法结构。
3.4设置cron任务的语法
在前面也说过通过croncat命令和/etc/crontab配置文件设置cron任务稍微有一些区别,但区别不大,下面通过语法结构来详细的介绍:
* * * * * command #===>crontab命令定义cron任务的语法结构
* * * * * user-name command #===>/etc/crontab配置文件定义cron任务的语法结构
如何实现设置计划任务,其实很简单,前面的五个星号使用执行周期时间的,后面command就是要执行的任务的具体命令,而/etc /crontab配置文件中定义的cron任务多了一个"user-name"表示这个任务以哪个用户身份执行,基本结构其实很简单,关键是要理解五个星 号的时间含义,下面就来具体介绍:
这个星号实际上分别表示:分钟、小时、日、月、周,比如前面示例中: 01 * * * * 表示每小时的第一分钟执行一次该任务、 0 12 * * * 表示每天的的12点的执行一次该任务,星号的含义就是“每”的意思,具体的取值范围:
分钟:0~59;小时:0~23;日:1~31;月:1~12;周:0~7;
可能有些歧义的是周的取值范围,每周0~7就有八个取值而每周只有7天这是什么意思,实际上每周的取值中0和7都是表示星期天;
有时候我们可能还会有需要在一个时间范围内的多个时间点执行该任务,就可以使用逗号(,)还分隔不同的时间点,比如每天的10点和18点执行一次的表示方式就是 0 10,18 * * * ;
有时候还有需要在一个时间范围内一个短期的连续执行任务就可以使用减号(-)来表示,比如希望在每天的8点至十二点的的每小时的20分钟时执行一次任务的表示方式就是 20 8-12 * * * ;
还有可以通过斜线加数值的方式(/n)来定义在一个时间范围内平分n个时间点出来执行一次该任务,比如希望每小时内执行五次该任务的表示方式就是 */5 * * * * ,但需要注意的是如果给定的平分参数n不能整除这个范围的总量,这个范围的最后的每个时间点都会执行一次该任务。
到 这里关于循环执行的计划任务设置就全部解析完了,能设置当然就会有删除任务,在前面的crontab命令的-r选项会将crontab定义到/var /spool/cron目录下的所有计划任务配置文件全部删除,需要谨慎操作;如果需要删除crontab命令设置的cron任务就是用该命令的-e去编 辑具体的任务配置文件,除了crontab命令设置任务还有/etc/crontab配置文件、/etc/cron.*固定周期任务目录相关的配置文件设 置cron任务就需要手动去编辑相关文件或删除脚本文件来实现删除相关的cron任务。
crond服务的任务同样也有两个权限配置文 件:/etc/cron.allow允许该配置文件中添加的用户名称的用户设置crond任务、/etc/cron.deny则是不允许该配置文件中的用 户设置cron任务。跟at一次计划任务一样,cron.allow优先cron.deny,如果cron.allow中允许了用户就不会再去检查 cron.deny的权限设置,但需要注意的是这两个配置文件只能实现用户使用crontab命令,当然手动编辑的相关配置文件也只有root有权限。
四、可唤醒停机期间的工作任务
根 据这一小节的标题就可以看出来要讨论的问题就是当系统关机时,在关机这个期间有需要执行的计划任务怎么办,相信你一定遇到过当你的电脑很长一段时间没有使 用后开机启动后系统会有一小段时间忙碌,此时硬盘会跑个不停,这是因为这时候系统在执行关机这段时间内没有执行的计划任务,也就是说实际上关机期间的计划 任务会在下一次开机后的某个时间点都执行一遍,既然会自动执行为什么还要讨论它呢?
因为默认设置可能并不符合执行所有关机期间的计划任务的 需求需要我们手动设置,也可以通过anacron命令去手动执行停机期间的任务,而不是等待系统自动执行。但一般情况下我们都不会使用anacron命令 去手动启动计划任务的执行,而是设置/etc/anacrontab这个配置文件来实现符合我们需求的开启自动执行停机期间的计划任务,不管怎么样先简单 的来了解一下anacron命令:
anacron [-sfn] [job]...
anacron -u [job]...
anacron命令的选项及参数解析:
-s:开始连续的执行各项任务(job),会根据时间记录文件的数据判断是否执行; -f:强制执行,而不去判断时间记录文件的时间戳;
-n:立即执行未执行的任务,而不延迟等待时间;
-u:仅更新时间记录文件的时间戳,不执行任何任务;
job:由/etc/anacrontab定义的各项任务名称;
因 为一般情况下并不会使用anacron命令,而且这个命令也很简单,更关键的是我需要了解唤醒停机任务的内部机制,如何设置相关配置文件,关于唤醒停机任 务的配置文件首先是基于crond的/etc/cron.{daily,weekly,monthly}下这些配置文件,在CentOS6.x之前 anacron是独立的服务,在新版本种anacron只是crond的內置工具,所以不再需要对anacron单独进行相关的服务管理,只要在 crond服务启动的情况下相关的功能就自动支持,anacron还有相对应的记录相关计划任务的上次执行时间戳,当时间超过任务应该执行的时间范围 anacron就会唤醒任务在适当的时间执行这些任务,至于什么是适当的时间还关系到一个配置文件/etc/anacrontab,下面先来看看这个配置 文件的内容:
cat /etc/anacrontab
# /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 #===>表示每天开机五分钟后检查,cron.daily下的任务是否被执行,如果没有执行就执行
7
25 cron.weekly
nice run-parts /etc/cron.weekly #===>表示每隔7天开机后25分钟检查,cron.weekly下的任务是否被执行,如果没有执行就执行
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly #表示每隔一个月开机后45分钟检查,cron.monthly下的任务是否被执行,如果没有执行就执行
#天数 延迟时间 任务名称 实际执行的命令
这里还是需要解释一下RANDOM_DELAY=45和 START_HOURS_RANGE=3-22,RANDOM_DELAY=45表示开机后最大延迟多久去执行检查命令,START_HOURS_RANGE=3-22则表示在3点至22点之间可以执行检查,然后检查时间会根据/var/spool/anacron/cron.*这些目录下的配置文件记录的对应任务的上次执行时间和当前时间来判定,下面以cron.daily工作为例来详细的介绍一下anacrontab的执行流程:
1.读取/var/spool/anacron/cron.daily文件中anacron上次执行的时间;
2.和当前时间比较,如果两个时间差值超过1天,就执行cron.daily工作;
3.只能在03:00~22:00执行这个工作;
4.执行工作时强制延迟时间为5分钟,在随机延迟0~45分钟;
5.使用nice命令指定默认优先级,使用run-parts脚本执行/etc/cron.daily 目录中所有的可执行文件。
一般在实际工作中可能START_HOURS_RANGE的可执行时间范围不符合我们需求,比如希望可执行时间是03:00~05:00可以将这一行配置修改为 START_HOURS_RANGE=3-5;还有可能强制延迟的时间这些可能不符合实际需求,比如间隔了一周开机的希望检查任务延迟也是5分钟可以修改配置为 7 5 cron.weekly nice run-parts /etc/cron.weekly ;不管如何现在已经直到anacrontab的配置数据的意义,根据需求修改即可。关于anacron其实很简单,就是会检查上一次cron任务的的执行时间是否超过应该执行任务的时间,如果检测到应该执行但没有执行就基于anacrontab的配置来执行一次。