anacron弥补cron的不足

anacron弥补cron的不足,第1张

anacron弥补cron的不足 为何有anacron

我们都知道,linux下cron服务可以实现计划任务的定时执行,那anacron 是干什么的呢?

简单说吧,cron可以指定任务在每天几点钟运行,可是如果那个钟点机器没有开机,那个任务便错过了时间,在一个新的时间轮回到达之前不会再运行。同理,每周,每月也一样。

anacron就是为了解决cron这种每天每周每月执行可能会错过的弊端而诞生的。那么,anacron 是如何判断这些定时任务已经超过执行时间的呢?anacron每次执行任务时,都会记录其执行时间到/var/spool/anacron/job_id文件中。

提示:job_id是指任务的名字,在/etc/anacrontab文件中指定。

victory@ubuntu:/var/spool/anacron$ 
victory@ubuntu:/var/spool/anacron$ sudo cat cron.daily 
[sudo] password for victory: 
20211225
victory@ubuntu:/var/spool/anacron$ ls -al
total 20
drwxr-xr-x 2 root root 4096 Dec 25 02:48 .
drwxr-xr-x 7 root root 4096 Sep 15 13:21 ..
-rw------- 1 root root    9 Dec 25 02:53 cron.daily
-rw------- 1 root root    9 Dec 25 03:03 cron.monthly
-rw------- 1 root root    9 Dec 25 02:58 cron.weekly
任务描述文件anacrontab

anacron 任务由/etc/anacrontab文件描述,任务使用下面的格式:

period delay job-id command

  • period - 这是任务的频率,以天来指定,或者是@daily 、@weekly、@monthly 代表每天、每周、每月一次。你也可以使用数字:1 - 每天、7 - 每周、30- 每月,或者N - 几天。
  • delay - 这是在执行一个任务前等待的分钟数。
  • job-id - anacron的日志输出中会带上这个,以及作为该任务的时间戳文件名字
  • command - 这是要执行的命令或 shell 脚本。

从上面的文件中看到,anacron默认定义了三个任务,分别代表每天执行/etc/cron.daily、每周执行/etc/cron.weekly、每月执行/etc/cron.monthly下的可执行文件。我们也可以定义自己的定时任务,anacron不像cron,没有提供编辑的功能,我们直接vim打开/etc/anacrontab文件进行编辑即可。

anacron常用选项

-t 配置文件路径

让anacron从指定配置文件中读取配置,常用于普通用户来管理个人任务

-S spooldir

设定新的spool目录来记录任务执行的时间戳,常用于普通用户来管理个人任务

-T

测试配置文件是否正确

-f

强制执行所有的任务,而不管之前的执行日期是否超过轮回天数

-u

将所有任务的执行日期都更新为当前日期,而不真正的执行任务

-s

串行地执行任务,只有前一个任务完成后才开始下一个任务

-d

不要fork成后台运行

anacron原理

anacron不像cron,它不是一个一直执行的后台服务,它借助了systemd提供的定时器,每天7点30分到23点的30分,每隔1小时自动执行一次,下面的RandomizedDelaySec=5m,表示到点时随机等待0-5分钟的时间再执行:

这里埋了个坑,从上面的配置可以看到,anacron在7:30-23:30之外的时间段不会执行。

/lib/systemd/system/anacron.timer是anacron.service的定时器配置文件,添加了一个/lib/systemd/system/xxx.timer,定时时间到就会自动的启动服务/lib/systemd/system/xxx.service。
关于systemd的定时器使用,我们有机会再开一篇。systemd这个搅屎棍,提出了timer来替代cron,奈何大家先入为主,systemd的timer一直都得不到推广,毕竟cron已经能满足大多数需求了。

在systemd体系的linux系统,anacron被做成了开机运行的服务:

这样子,每次开机anacron就会被执行一次,以检查上次关机以来是否有些任务被漏执行了,补充执行。anacron不是常驻服务,执行完一次后发现没有任务需要执行,就自动退出了。

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

  1. 读取 /var/spool/anacron/cron.daily 文件中 anacron 上一次执行该任务的时间。
  2. 和当前时间比较,如果两个时间的差值超过 1 天,就执行 cron.daily 工作。
  3. 执行工作时强制延迟时间为 5 分钟
  4. 使用 run-parts 脚本执行 /etc/cron.daily 目录中所有的可执行文件。

大家会发现,/etc/cron.{daily,weekly,monthly} 目录中的脚本在当前的 Linux 中是被 anacron 调用的,不再依靠 cron 服务。看下/etc/crontab就知道:

test -x /usr/sbin/anacron表示检测anacron是否是可执行程序,如若存在,后面的或语句就不会执行了,相当于cron的daily、weekly、monthly被架空了,把这些工作交由了anacron去执行了。

anacron 不用设置多余的配置,我们只需要把需要定时执行的脚本放入 /etc/cron.{daily,weekly,monthly} 目录中,就会每天、每周或每月执行,而且也不再需要启动 anacron 服务了。如果需要进行修改,则只需修改 /etc/anacrontab 配置文件即可。

看下anacron的日志输出:

和我们的说法一致,anacron会每隔一小时被调用一次,每次会检查配置的任务是否需要执行,需要的话则执行,从上面的日志也可以看到,daily是推迟5分钟执行的,weekly是推迟10分钟执行的,monthly是推迟15分钟执行的,和/etc/anacrontab中的设置一致。

总结

systemd介入之后,总体感觉定时任务的设计变得非常混乱了。原本的cron大家都用得好好的,systemd设计了timer之后,意欲使用systemd.timer替代cron,但又要保留对cron的兼容,就造成了上面的局面。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5682528.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存