anacron

警告
本文最后更新于 2023-10-23,文中内容可能已过时。

anacron

anacron 可以看作是对crontab命令的补充,主要体现在,cron设置的定时任务,到了符合时间表达式的时间,如果此时服务器是关机状态,那 cron 配置定时任务就不会执行(废话),而且事后服务器开机了也不会补上,错过了就错过了,因为cron配置的定时任务的实践都是精确的,anacron的出现就是为了解决这个问题,anacron 会以固定的周期检测任务是否执行(其实就是查看执行时间日志,对比当前时间和上次执行的时间,看有没有超过周期)。如果(因为关机)没有执行,则执行任务anacroncron的区别就在于这个检测固定周期内任务是否执行的行为,而且anacron还有延迟时间的选项,可以让任务的执行时间分散,防止一瞬间对服务器产生太大压力。

anacron 不是单独的服务,而是系统命令。也就是说,我们不使用service anacron restart命令来管理 anacron 服务,而需要使用 anacron 命令来管理 anacron 工作。这一点跟cron很不一样。

1
anacron [选项] [作业的标识符]
  • -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.dailycron.weeklycron.monthly三个目录是/etc/anacrontab这个配置文件调用的。

我们用 cron.daily 工作来说明一下 /etc/anacrontab 的执行过程:

  1. 读取 /var/spool/anacron/cron.daily 文件中 anacron 上一次执行的时间。

  2. 和当前时间比较,如果两个时间的差值超过 1 天,就执行 cron.daily 工作。

  3. 只能在 03:00-22:00 执行这个工作。

  4. 执行工作时强制延迟时间为 5 分钟,再随机延迟 0~45 分钟。

  5. 使用 nice 命令指定默认优先级,使用 run-parts 脚本执行 /etc/cron.daily 目录中所有的可执行文件。

/var/spool/anacron 执行日志文件夹

执行日志文件夹 /var/spool/anacron ,一个定时任务一个文件,文件名是作业标识符

日志中记录的,是作业执行的时间,任务完成后, anacron/var/spool/anacron 目录内相应的文件中记录日期,注意这里只记录日期,无具体时间,注意,日志文件中只会存一个日期,第二次写入会覆盖第一次写入的值

anacron 与 cron 的区别

  • cron任务同通过常驻的守护进程crond来定期执行的。而anacron则不是守护进程,它需要被别人定期掉起,比如跟cronsystemd 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中一瞬间大量任务并发执行而导致系统压力过大的问题

0%