一、简介
通常对于一台24小时不停歇的Linux服务器来说,正常的计划任务都是通过crontab或at命令来执行的。但是当某天因维护等原因需要对服务器进行关机升级的时候,原本该段时间(关机时间段)内需要执行的计划任务就会在开机后被推迟到第二天的运行时间点再执行,那么相当于当天的计划任务就被推迟了,这种情况在某些场景内是不可接受的。这时候就可以使用anacron命令来使得在系统重新开机后,把关机时间内的计划任务执行一次。anacron命令实际是依赖于crond服务实现的。
二、anacron命令的使用
1、命令格式
anacron [options] [job]
2、常用选项
-s:开始所有的jobs,并根据时间戳判断是否开始相应的工作job;
-f:强制进行,忽略时间戳的对比;
-n:立即进行未进行的任务,忽略延迟等待时间;
-u:仅升级相应的执行时间戳,实际不进行任何工作;
job:/etc/anacrontab文件中定义的各项工作名称;
3、anacron任务的配置
与anacron任务运行的相关配置文件包括:
/etc/anacrontab、/var/spool/anacron/cron.daily、/etc/cron.hourly/0anacron及/etc/cron.d/0hourly。
其中/etc/anacrontab文件为anacron任务的配置文件,其内容如下:
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
1 0 test.daily /bin/bash /tmp/anacron.sh
前三行为定义anacron任务的基本环境,一般变动不大,其后两行表示:
RANDOM_DELAY=45:设置为anacron任务添加的随机延迟的最大值,单位为分钟,一个anacron任务的运行的总延迟时间为RANDOM_DELAY+Base_delay;
START_HOURS_RANGE=3-22:设置anacron任务执行的时间范围,此处表示anacron任务只能在3am-22pm的时间范围内执行;
在下面为anacron任务的配置行,每一行对应一个anacron任务,对应每列含义为:
period in days:周期天数,指任务在多少天内执行一次,7表示七天内执行一次,可以使用@daily、@weekly、@monthly来表示周期;
delay in minutes:延迟时间,单位为分钟;
job-identifier:任务标识,这个与/var/spool/anacron/ 目录下的时间戳文件名相一致,anacron任务通过此标识来获取对应的时间戳判断是否执行该任务;
COMMAND:anacron任务执行的内容;
4、anacron任务的工作流程
下面梳理下anacron工程的流程,以便更好理解anacron任务的工作。这里以Centos 6.8为系统背景对相关的anacron任务流程进行描述。
首先当系统启动时,系统调度服务crond会执行/etc/cron.d/0hourly中的设置:
[root@localhost ~]# cat /etc/cron.d/0hourly
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
01 * * * * root run-parts /etc/cron.hourly #每小时的第1分钟执行一次/etc/cron.hourly目录中的脚本文件
而在/etc/cron.hourly目录下包含0anacron脚本文件,其内容为:
[root@localhost ~]# ll /etc/cron.hourly/
total 4
-rwxr-xr-x. 1 root root 409 Aug 24 2016 0anacron
[root@localhost ~]# cat /etc/cron.hourly/0anacron
#!/bin/bash
# Skip excecution unless the date has changed from the previous run
if test -r /var/spool/anacron/cron.daily; then #判断对应的时间戳文件是否可读
day=`cat /var/spool/anacron/cron.daily` #随后读取对应的时间戳并赋值给day
fi
if [ `date +%Y%m%d` = "$day" ]; then #判断当前时间戳是否与读取的时间戳相一致,如果相同则退出脚本;
exit 0;
fi
# Skip excecution unless AC powered #在电池模式不执行anacron任务;
if test -x /usr/bin/on_ac_power; then
/usr/bin/on_ac_power &> /dev/null
if test $? -eq 1; then
exit 0
fi
fi
/usr/sbin/anacron -s #执行anacron任务
上述脚本的最后一行/usr/sbin/anacron -s
即表明了开始执行/etc/anacrontab里面的anacron任务了,此时便会读取/etc/anacrontab文件的内容:
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=5
# 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
1 0 test.daily /bin/bash /tmp/anacron.sh
该文件最后一行表示,该anacron任务,在每天3am-22pm范围内执行1次,并且其delay时间为RANDOM_DELAY+delay in minutes,即5+0,该anacron任务对应的执行时间戳文件为test.daily(可自定义),在执行前会将执行时间戳文件的日期与当前日期作比较,如果超过1天(含1天)的话就执行anacron任务。
所以根据上述描述,anacron任务的工作流程可以总结为:
1、系统启动后,crond服务执行每小时调度任务/etc/cron.d/0hourly来执行/etc/cron.hourly/0anacron 任务。
2、/etc/cron.hourly/0anacron 首先判断今天是否已经运行过anacron任务,随后判断系统是否运行在电池模式,如果结果都为否,则执行/usr/sbin/anacron -s
命令。
3、随后anacron命令由/etc/anacrontab文件分析到test.daily这个任务的工作间隔为1天;
4、从anacron命令从/var/spool/anacron/test.daily文件中取出此anacron任务最近一次运行时间戳;
5、对比当前时间戳与上一个步骤读取的时间戳,如差异天数为1天或以上,则准备运行命令;
6、在延迟时间过后,开始运行相关的命令,即/bin/bash /tmp/anacron.sh
。
7、运行完毕后,修改对应的时间戳文件为当前时间,anacron程序结束。
上述即为anacron任务的具体运用及相关工作流程,如有错误,欢迎指点。
网友评论