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 执行定时任务了。

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 来查看它的说明

    https://lk-images.oss-cn-beijing.aliyuncs.com/images/202310231954640.png

    我们自定义的 command 仍然需要遵守跟 crontab -e 中的命令一样的条件,但是命令中是没有配置执行人的,那实际的执行人是谁呢?我猜是 root,因为普通用户没有编辑这个文件的权限。而这里又不指定用户,所以应该默认就是以 root 的权限执行,测试一下:

    先修改 /etc/anacrontab

    https://lk-images.oss-cn-beijing.aliyuncs.com/images/202310231956701.png

    然后执行:anacron -f -n lkanacron,可以看到 /home/lk/bbb.txt 中有了 root 下所有文件。

crontab 命令一样,如果你不将标准输出重定向,命令的执行结果会通过邮件,发送到 /var/spool/mail/root 中(MAILTO 里面配置的)

/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 ,一个定时任务一个文件,文件名是作业标识符

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

  • 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%