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
中一瞬间大量任务并发执行而导致系统压力过大的问题。