我们都知道,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常用选项anacron原理-t 配置文件路径
让anacron从指定配置文件中读取配置,常用于普通用户来管理个人任务
-S spooldir
设定新的spool目录来记录任务执行的时间戳,常用于普通用户来管理个人任务
-T
测试配置文件是否正确
-f
强制执行所有的任务,而不管之前的执行日期是否超过轮回天数
-u
将所有任务的执行日期都更新为当前日期,而不真正的执行任务
-s
串行地执行任务,只有前一个任务完成后才开始下一个任务
-d
不要fork成后台运行
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 的执行过程:
- 读取 /var/spool/anacron/cron.daily 文件中 anacron 上一次执行该任务的时间。
- 和当前时间比较,如果两个时间的差值超过 1 天,就执行 cron.daily 工作。
- 执行工作时强制延迟时间为 5 分钟
- 使用 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的兼容,就造成了上面的局面。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)