目录
1、任务调度工具anacron介绍
2、新旧版本Linux中anacron工具的区别
3、/etc/cron.{daily,weekly,monthly}目录说明
4、anacron命令
5、/etc/anacrontab的执行过程
在Linxu系统中,有三种用于任务调度的工具
<code>at</code>命令调用<code>atd</code>服务
<code>crontab</code>命令调用<code>cron(crond)</code>服务。
<code>anacron</code>工具。
(1)<code>anacron</code>工具是用来干什么的呢?
如果Linux服务器不是24小时开机的,那么刚好在关机的时间段之内有系统定时任务(<code>cron</code>)需要执行,那么这些定时任务是不会执行的。
假设我们需要在凌晨3点03分执行系统的日志备份,但是我们的Linux服务器不是24小时开机的,在晚上需要关机,白天上班之后才会再次开机。这个定时任务的执行时间,我们的服务器刚好没有开机,那么这个任务就不会执行了,<code>anacron</code>工具就是用来解决这个问题的。
<code>anacron</code>工具会使用一天,七天,一个月作为检测周期,用来判断是否有定时任务在关机之后没有被执行,如果有这样的任务,<code>anacron</code>工具会在特定的时间重新执行这些定时任务。
<code>anacron</code>工具以天为单位,周期性地执行命令。<code>anacron</code>是以天为单位,而 <code>cron</code>最小执行的周期是分钟。
(2)那么<code>anacron</code>工具是如何判断这些定时任务已经超过了执行时间的呢?
在系统的<code>/var/spool/anacron/</code>目录中存在<code>cron.{daily,weekly,monthly}</code>文件,这些文件中都保存着<code>anacron</code>工具上次执行时的时间。<code>anacron</code>工具会去读取这些文件中的时间,然后和当前时间做比较,若果两个时间的差值超过了<code>anacron</code>工具配置文件中的指定时间差值(一般是1天,7天和一个月)(<code>/etc/anacrontab</code>文件),就说明有定时任务漏掉了没有被执行,这时<code>anacron</code>工具会介入而执行这个漏掉的定时任务,从而保证在关机时没有被执行的定时任务,不会被漏掉。
在原先的<code>CentOS 5.x</code>版中<code>/etc/cron.{daily,weekly,monthly}</code>这些目录中的定时任务会同时被<code>cron</code>工具和<code>anacron</code>工具调用,这样非常容易出现重复执行同一个定时任务的错误。
在<code>CentOS 6.x</code>中,我们使用<code>cronie-anacron</code>取代了<code>vixie-cron</code>软件包。<code>/etc/cron.{daily,weekly,monthly}</code>目录中的定时任务程序只会被<code>anacron</code>工具调用,从而保证这些定时任务只会在每天、每周或每月被定时执行一次,而不会重复执行。这也是我们在上一篇文章中介绍的<code>CentOS 6.x</code>的变化之一。
在<code>/etc</code>目录下面有<code>crontab</code>的两个文件<code>crontab</code>和<code>cron.deny</code>,还有五个目录<code>cron.d</code>、<code>cron.daily</code>、<code>cron.hourly</code>、<code>cron.monthly</code>、<code>cron.weekly</code>。
如下图所示:

说明:
<code>cron.deny</code>:文件就是用于控制不让哪些用户使用<code>Crontab</code>的功能。
<code>crontab</code>:是设定定时任务执行文件。
<code>cron.d</code>:是系统自动定期需要做的任务。
<code>cron.daily</code>:是每天执行一次的<code>job</code>。
<code>cron.hourly</code>:是每个小时执行一次的<code>job</code>。
<code>cron.monthly</code>:是每月执行一次的<code>job</code>。
<code>cron.weekly</code>:是每个星期执行一次的<code>job</code>。
在<code>CentOS 6.x</code>中<code>anacron</code>命令还有一个变化,<code>anacron</code>工具不再是单独的服务,而变成了系统命令。也就是说我们不再可以使用<code>service anacron restart</code>命令来管理<code>anacron</code>服务了。而是需要使用<code>anacron</code>命令来管理<code>anacron</code>工具工作,具体命令如下:
在Linux 6版本中,其实不需要执行任何<code>anacron</code>命令,只需要配置好<code>/etc/anacrontab</code>文件,系统就会依赖这个文件中的设定,来通过<code>anacron</code>工具执行定时任务。
那么关键就是<code>/etc/anacrontab</code>文件的内容了,这个文件如下:
说明:在上面文件中
<code>RANDOM_DELAY</code>定义的是最大随机延迟,也就是说<code>cron.daily</code>任务如果超过1天没有执行,并不会马上执行,而是先延迟强制延迟时间之后,再延迟随机延迟时间之后再执行命令。
<code>START_HOURS_RANGE</code>定义<code>anacron</code>的执行时间范围,<code>anacron</code>只会在这个时间范围之内执行。
<code>period in days</code>执行周期;最小 1 天,也可以 3 天,5 天,一个星期(7 天)乃至一个月(月份不能确定有多少天,所以用<code>@monthly</code>代替)。
<code>delay in minutes</code>延迟多长时间执行,以分钟为单位。为了避免多个任务在同一时间执行而造成服务器繁忙,所以应该错峰执行。
<code>job-identifier</code> 任务的唯一标识。它用来创建文件记录任务执行的时间,通常创建在<code>/var/spool/anacron/</code>目录中。
<code>command</code>真正执行的命令。
我们用上面配置文件中的<code>cron.daily</code>工作来说明下<code>/etc/anacrontab</code>的执行过程:
首先读取<code>/var/spool/anacron/cron.daily</code>中的上一次<code>anacron</code>执行的时间.
和当前时间比较,如果两个时间的差值超过1天,就执行<code>cron.daily</code>工作。
执行这个工作只能在<code>03:00-22:00</code>之间。
执行工作时强制延迟时间为5分钟,再随机延迟<code>0-45</code>分钟时间。
使用nice命令指定默认优先级,使用<code>run-parts</code>脚本执行<code>/etc/cron.daily</code>目录中的所有可执行文件。
大家发现了吧,<code>/etc/cron.{daily,weekly,monthly}</code>中的脚本,在当前的Linux中是被<code>anacron</code>调用的,不再依靠<code>cron</code>服务。(最重要的你要知道:无论在新旧版本的Linux系统中,<code>/etc/cron.{daily,weekly,monthly}</code>目录中的脚本文件,都是可以被正常执行的,关于是<code>cron</code>工具和<code>anacron</code>工具谁来调用的,你可以不用关心。)不过<code>anacron</code>不用设置多余的配置,我们只需要把需要定时执行的脚本放入<code>/etc/cron.{daily,weekly,monthly}</code>目录当中,就会每天、每周或每月执行,而且也不再需要启动<code>anacron</code>服务了,因为<code>anacron</code>命令是一个系统命令。