anacron
anacron
anacron 可以看作是对crontab命令的补充,主要体现在,cron设置的定时任务,到了符合时间表达式的时间,如果此时服务器是关机状态,那 cron 配置定时任务就不会执行(废话),而且事后服务器开机了也不会补上,错过了就错过了,因为cron配置的定时任务的实践都是精确的,anacron的出现就是为了解决这个问题,anacron 会以固定的周期检测任务是否执行(其实就是查看执行时间日志,对比当前时间和上次执行的时间,看有没有超过周期)。如果(因为关机)没有执行,则执行任务。anacron跟cron的区别就在于这个检测固定周期内任务是否执行的行为,而且anacron还有延迟时间的选项,可以让任务的执行时间分散,防止一瞬间对服务器产生太大压力。
anacron 不是单独的服务,而是系统命令。也就是说,我们不使用service anacron restart命令来管理 anacron 服务,而需要使用 anacron 命令来管理 anacron 工作。这一点跟cron很不一样。
|
|
-
-f:强制执行相关工作(带了[作业的标识符]就是操作特定的作业,不带就是执行所有作业),忽略时间日志文件。 -
-n:立即执行相关工作(带了[作业的标识符]就是操作特定的作业,不带就是执行所有作业),忽略所有的延迟时间。 -
-u:更新相关工作(带了[作业的标识符]就是操作特定的作业,不带就是执行所有作业)的时间日志文件中的时间戳为当前日期,但不执行任何工作。 -
-s:依据 /etc/anacrontab 文件中顺序执行工作,在前一个工作未完成前,不会开始下一个工作。 -
-q:禁止将信息输出到标准错误,常和 -d 选项合用。
常用参数 -f -n
这里的作业标识符指的是依据 /etc/anacrontab 文件中定义的作业的标识符。
在 Linux 中,其实不需要执行任何 anacron 命令,只需要配置好 /etc/anacrontab 文件,系统就会依赖这个文件中的设定来通过 anacron 执行定时任务了。
/etc/anacrontab 文件
anacron的重点:/etc/anacrontab 文件:这个文件只有 root 用户可以查看编辑
看起来跟 cron 的配置文件有点像。都是先定义环境变量,再定义执行计划。
环境变量
-
RANDOME_DELAY=45:表示anacron在执行任务前先延时一段随机的时间再执行,这段随机的时间为0-45分钟之内的随机数。 -
START_HOURS_RANGE=3-22:指定了只有在凌晨 3 点到晚上 22 点这个时间段内才允许执行任务。
定义执行计划
-
period in days:轮回天数,表示任务多少天执行一次。这是以天为单位指定的工作执行频率,可以是每天@daily,每周@weekly或 每月@monthly一次。你也可以使用数字:1 每天,7 每周,30 每月和 N 每 n 天。 -
delay in minutes:表示启动anacron和运行作业时间之间的延迟,单位为分钟。当然前提是自最后一次运行之后所经过的时间超出了轮回天数。但是它并不是作业真正运行的时间,真正运行的时间还需要加上 RANDOME_DELAY 中设置的随机分钟数。 -
job-identifier:作业的标识符,对应anacron [选项] [作业标识符]中的作业标识符。anacron在执行任务时会将日期写入/var/spool/anacron/$job-identifier文件中,这个文件只记录时间,所有叫做时间日志文件,一个工作/作业有一个单独的时间日志文件,一个时间日志文件只记录一个时间,即作业上次的执行时间。 -
command:实际运行的命令。这里的run-parts是一个运行指定目录中所有程序与脚本的命令,可以通过man run-parts来查看它的说明
我们自定义的 command 仍然需要遵守跟
crontab -e中的命令一样的条件,但是命令中是没有配置执行人的,那实际的执行人是谁呢?我猜是 root,因为普通用户没有编辑这个文件的权限。而这里又不指定用户,所以应该默认就是以 root 的权限执行,测试一下:先修改
/etc/anacrontab
然后执行:
anacron -f -n lkanacron,可以看到/home/lk/bbb.txt中有了 root 下所有文件。
跟crontab命令一样,如果你不将标准输出重定向,命令的执行结果会通过邮件,发送到/var/spool/mail/root中(MAILTO里面配置的)
anacron 和 cron 的联系
/etc/anacrontab 文件的前三个配置项明确地告诉我们,cron.daily 、cron.weekly、cron.monthly三个目录是/etc/anacrontab这个配置文件调用的。
我们用 cron.daily 工作来说明一下 /etc/anacrontab 的执行过程:
-
读取
/var/spool/anacron/cron.daily文件中anacron上一次执行的时间。 -
和当前时间比较,如果两个时间的差值超过 1 天,就执行
cron.daily工作。 -
只能在
03:00-22:00执行这个工作。 -
执行工作时强制延迟时间为 5 分钟,再随机延迟 0~45 分钟。
-
使用
nice命令指定默认优先级,使用run-parts脚本执行/etc/cron.daily目录中所有的可执行文件。
/var/spool/anacron 执行日志文件夹
执行日志文件夹 /var/spool/anacron ,一个定时任务一个文件,文件名是作业标识符

日志中记录的,是作业执行的时间,任务完成后, anacron 在 /var/spool/anacron 目录内相应的文件中记录日期,注意这里只记录日期,无具体时间,注意,日志文件中只会存一个日期,第二次写入会覆盖第一次写入的值。
anacron 与 cron 的区别
-
cron任务同通过常驻的守护进程crond来定期执行的。而anacron则不是守护进程,它需要被别人定期掉起,比如跟cron或systemd timer配合 -
crond每分钟检查一次是否有需要执行的任务,若这次任务错过了时间则需要等下次触发点才能再次执行。而anacron会立即执行错过时间的任务,而正是由于这个特点,为了防止在不恰当的时刻执行命令,anacron专门有一个参数START_HOURS_RANGE来设置允许执行命令的时间段。 -
cron的粒度能精确到分钟,而anacron的粒度只能到天(即执行频率不能超过 1 天 1 次) -
cron的执行时间是很精确的。而anacron可以设置一个延迟时间 (RANDOMDELAY),anacron会在这个延迟时间内的某一个随机时间点执行。这样做的好处在于可以让任务的执行时间分散,防止一瞬间对服务器产生太大压力。 -
cron有多个设置任务的地方 (/var/spool/cron/用户名,/etc/crontab,/etc/cron.d/*). 而anacron只有一个设置任务的地方 (默认为/etc/anacrontab, 也可以通过-t设置其他路径的配置文件)。
从上面可以看出,anacron其实并不是设计来定时执行任务的,它的主要功能还是为了缓解cron中一瞬间大量任务并发执行而导致系统压力过大的问题。
小虾米