anacron系统调度说明

版权声明:自我梳理及总结的内容,如果您需要转载请注明出处,非常感谢! https://blog.csdn.net/Smasegain/article/details/50569486
一.关联文件及命令说明
因为cron所调度的job只能在服务器running期间被成功调用,如果服务器启动后已经过了scheduler时间点就不会再调度该任务。而anacron则是 按天为周期,如果出现重启后上次执行时间到当前时间已经超过周期会直接执行(计算方式为周期长短)。

1.1.anacron的启动
RHEL 6.5默认情况下anacron的初次调用也是通过cron来实现的,以下是过程:
1).crond随着系统启动而启动,每分钟去扫描一次各个cron table;
2).在/etc/cron.d/下有个0hourly的cron table中记录了调用anacron的命令:
[root@node110 cron.d]# cat 0hourly
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
01 * * * * root run-parts /etc/cron.hourly
3).上面的cron table调用了/etc/cron.hourly中的可执行部分:
4).0anacron就是启动anacron的脚本啦,另外一个嘛有兴趣可以研究下:
#!/bin/bash
#in case file doesn't exist -->判断当天是否已经执行过了;
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

# in case anacron is already running, -->检查进程是否已经在执行
# there will be log (daemon won't be running twice).
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--以串行方式调用

5). 如果想要关闭anacron的调度,可以在/etc/cron.hourly/jobs.deny中加上0anacron的job。

1.2.anacron命令
按照Manual的说法Anacron的调度周期是以天为单位的(Anacron is used to execute commands  periodically, with a frequency specified in days.),读取/etc/anacrontab中以天为单位的周期计划和分钟为单位的延迟执行安排。配置文件详细内容参照1.3,调度方式如下:
1).参照1.1.中的调度过程启动anacron;
2).anacron检查在过去的n天中有没有执行过对应的任务(n为period),如果没有执行则直接等待随机延时+指定delay后调用该command部分匹配的任务(如果只有路径,没有特定限制则执行该目录下的全部shell);
3).执行完成后,anacron在 /var/spool/anacron/<job_identifier> 的 timestamp 文件中本次执行的日期(因调度周期以天为单位,不记录小时和分钟);
4).如果job有标准输出或标准错误,anacron会将输出信息mail发送给MAILTO的用户,或者anacron的调用者(通常是root);
5).如果已经在等待delay去调用job的时候该job处于"Active"状态,其他anacron将无法调用这个anacron job;
6).如果在执行过程中收到SIGUSR1的信号,anacron会在执行完当前JOB后退出;

7).anacron的日志信息被发送到syslogd或者rsyslogd,分组为cron,优先级为notice,如果是报错信息优先级为error

以下是anacron的语法:
anacron  [-s]  [-f] [-n] [-d] [-q] [-t anacrontab] [-S spooldir] [job]
anacron [-S spooldir] -u [-t anacrontab] [job]
anacron [-V|-h]
anacron -T [-t anacrontab]
-f: 表示强制调用,忽略本来的周期;
-u: 仅更新timestamp文件而不真正调用job,可以用来调整anacron的执行周期;
-s: 串行调用任务,从1.1的(4)可以看到默认就是串行调用,不指定此参数则到时间就直接执行(不便于设置依赖关系);
-n: 跳过delay直接执行,隐含调用了-s的参数;
-d: 不将任务在后台调度,信息会输出到前台,方便调试;
-q: 不显示报错信息到标准输出,可以与-d一起使用;
-t anacron table:指定默认anacrontab以外的其他配置文件;
-T: Anacrontab检验,如果语法有误则返回1,无误返回0;
-S spooldir:指定存放timestamp文件的路径,This option is required for users who wish to run anacron themselves;
-V: 显示版本信息后退出;
-h: 显示简单的帮助信息后退出


1.3.anacron配置文件(/etc/anacrontab)
anacrontab配置文件记录了anacron调度的定时任务,该配置文件主要包含了三类信息:
1).Job描述信息:主要语法有如下两种, ' \'可以直接对JOB描述信息进行换行
period        delay  job-identifier  command
@period_name  delay  job-identifier  command
a).period表示以天为单位的时间周期,@period_name类似于cron中的周期别名:
@reboot 
@yearly 
@annually
@monthly
@weekly 
@daily   
@hourly 

b).delay表示到该时间点以后再延迟delay指定的分钟数后再执行,如果设定了RANDOM_DELAY(分钟单位)的环境变量,0到RDNDMON_DELAY的随机数加上JOB设定的delay分钟后才会执行该任务。例如,RANDOM_DELAY为12,任务delay为3.则该任务的delay时间范围为:0+3=3到12+3=15;

c).job-identifier表示任务描述,可以是斜线以外的任意非空字符,同时用于anacron的日志信息标示符和锁文件(/var/spool/anacron/<job_identifier>)的文件名

d).command则可以是任意shell命令,anacrontab中默认的:nice run-parts /etc/cron.daily分别表示,nice表示调整优先级;run-parts表示执行/etc/cron.daily中的所有可执行文件,



2).环境变量:定义方式为VAR = VALUE,变量名周围的空格会被忽略,变量值里面不能有空格;
a).变量的影响范围为变量定义的 下一行下次定义该变量的值者文件末尾;
b).START_HOURS_RANGE=3-18,表示任务可运行时间为3:00-18:00,超过则不能运行;
c).RANDMON_DELAY表示取0到此变量值中的随机数加上job默认delay作为job的实际delay分钟数;



3).空行:真真的空行和以#开头的注释行


二.范例
2.1.默认范例
只能在6:00-8:00之间运行的JOB,且delay时间最大30min:
# environment variables
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
RANDOM_DELAY=30
# Anacron jobs will start between 6 and 8 o’clock.
START_HOURS_RANGE=6-8
# delay will be 5 minutes + RANDOM_DELAY for cron.daily
1         0    cron.daily          nice run-parts /etc/cron.daily
7         0    cron.weekly         nice run-parts /etc/cron.weekly
@monthly  0    cron.monthly        nice run-parts /etc/cron.monthly


















猜你喜欢

转载自blog.csdn.net/Smasegain/article/details/50569486