网上的各种资料中往往对crontab讲的比较多,但是对anacron却是一笔带过。这篇文章就是重点来讲一下anacron的功能。
举一个例子:我们在linux下的例行工作中设置每周日早上9点对我的某个目录做一次清理,但是呢,恰好这周日早上停电了。那么,在这个时间段内,我们的linux根本不会工作,就更谈不上执行我们的例行工作了。也就是说,在下周日早上9点到来之前,我们的这个例行工作任务是不会主动执行的。这个时候就需要我们的anacron来唤醒停机期间的例行工作任务了。
首先,我们要明确一点的是,anacron和crontab并不是矛盾的,相反,anacron更是完善了crontab的工作,让我们的例行工作任务更加的完美。
anacron实际上是一个程序,以Centos 7为例:调用anacron程序的脚本位于/etc/cron.hourly这个目录中,也就是0anacron这个文件
0abacron位于/etc/hourly这个目录中,也就是说anacron是每小时被执行一次。那我们就用vim打开0anacron看一下吧!
0anacron中的具体内容
脚本中,可以看到,首先检查今天是否已经执行过anacron,如果已经执行过,就没必要再执行了。再检查是否此时电量不足,如果处于低电量状态,也不会执行anacron。说明anacron的执行情况还是很严密的哦!
那么脚本最后一句 /usr/sbin/anacron -s 又是什么意思呢?
答:anacron这个程序会根据 /etc/anacron 这个文件中的配置来决定该如何进行,具体的anacron的执行参数读者可以通过 man anacron来查询。
那么,此时我们当然要来看一看 /etc/anacron 这个配置文件到底写的什么喏!
/etc/anacron 中的具体内容
前面几行代码,就是来配置执行环境。下面的几行代码是最重要也要重点理解的:
#period in days delay in munitus 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
以 1 5 cron.daily nice run-parts /etc/cron.daily 这一行来讲解各个参数的意义:
(1)1 天数:anacron执行当下与时间戳记(/var/spool/anacron/nei的时间记录档)相差的天数,如果超过此天数1,就执行后面的nice run-parts /etc/cron.daily,否则就不执行。
(2)5 延迟时间:即便是超过天数要执行后面的代码,也要延迟5分钟,可能在某些情况下立即启动会和其他地方造成冲突,可见这个考虑还是很周到的嘛!
(3)cron.daily 工作名称定义:和 /var/spool/anacron中记载该项任务的名称一样
(4)nice run-parts /etc/cron.daily 实际要执行的指令:run-parts 表示执行后面/etc/cron.daily这个目录中的所有可执行文件。
那么,现在我们就以cron.daily为例,来说明anacron的执行流程吧:
1.首先,anacron启动后会参考 /etc/anacron这个配置文件,并且分析出cron.daily这项工作名称的天数为1;
2.然后来到 /var/spool/anacron/cron.daily 这个文件,取出最近一次执行anacron的时间;
3.将取出的最近一次执行anacron的时间与现在色时间作差,并与前面的天数1比较,如果超过1天,就准备执行指令;如果不超过,后面的流程不予考虑,到此结束;
4.准备执行指令时,还要根据前面的延迟时间作出延迟;
5.延迟时间到达后,就要真正地执行run-parts /etc/cron.daily了,执行完毕后,anacron就程序结束了。
这里需要注意的就是,造成天数差异超过一天的原因:在非正常断电或者人为关机的情况下,/etc/cron.daily内的程序不能得到有效的执行,因此/var/spool/anacron/cron.daily内记录的时间就得不到更新,所以就造成了天数超过一天的差异。
/var/spool/anacron/下文件如下:
/var/spool/anacron/下的文件
看一看/var/spool/anacron/cron.daily下的内容:
/var/spool/anacron/cron.daily具体时间记录
通过上面的讲解,你是否对anacron的执行情况有更深的理解呢?
还有一点要注意的是,如果例行执行的任务放置在/etc/crontab中,那么过期之后在下一个周期之前,是不会被anacron执行的;但是,如果每周要执行的任务放置在 /etc/cron.weekly 目录下,那么这个工作几乎一定会在一周内被执行一次。(除非你一直不开机,那即便是anacron也没有办法喏!)
anacron和crontab是linux下非常好的东东哟,尽情享受它们带来的便利吧!