首页 > 编程笔记 > Linux笔记 阅读:1

Linux anacron用法详解(附带实例)

Linux 服务器如果不是 24 小时开机的,而刚好在关机的时间段之内有系统定时任务(cron)需要执行,那么这些定时任务是不会执行的。也就是说,假设我们需要在凌晨 5 点 05 分执行系统的日志备份,但是我们的 Linux 服务器恰巧在这个定时任务的执行时间没有开机,那么这个定时任务就不会执行了。anacron 就是用来解决这个问题的。

anacron 会使用一天、七天、一个月作为检测周期,用来判断是否有定时任务在关机之后没有执行。如果有这样的任务,anacron 就会在特定的时间重新执行这些定时任务。

那么,anacron 是如何判断这些定时任务已经超过执行时间的呢?在系统的 /var/spool/anacron/ 目录中存在 cron.{daily,weekly,monthly} 文件,这些文件中都保存着 anacron 上次执行的时间。anacron 会读取这些文件中的时间,然后和当前时间进行比较,如果两个时间的差值超过 anacron 的指定时间差值(一般是一天、七天和一个月),就说明有定时任务没有执行,这时 anacron 会介入并执行这个漏掉的定时任务,从而保证在关机时没有执行的定时任务不会被漏掉。

当前系统中使用 cronie-anacron 取代了 vixie-cron 软件包。而且,旧版 CentOS(CentOS 5.x 以前)的 /etc/cron.{daily,weekly,monthly} 目录中的定时任务会同时被 cron 和 anacron 调用,这样非常容易出现重复执行同一个定时任务的错误。而在 CentOS 7.x 以后的系统(当然包含 Rocky Linux 9)中,/etc/cron.{daily,weekly,monthly} 目录中的定时任务只会被 anacron 调用,从而保证这些定时任务只会在每天、每周或每月定时执行一次,而不会重复执行。

在当前系统中,anacron 还有一个变化,那就是 anacron 不再是单独的服务,而变成了系统命令。也就是说,我们不再使用服务管理命令来管理 anacron 服务,而需要使用 anacron 命令来管理 anacron 工作,具体命令格式如下:
[root@localhost ~]# anacron [选项] [工作名]
选项: 参数:
在当前的 Linux 系统中,其实不需要执行任何 anacron 命令,只需要配置好 /etc/anacrontab 文件,系统就会依赖这个文件中的设定来通过 anacron 执行定时任务了。那么,关键就是 /etc/anacrontab 文件的内容,这个文件的内容如下:
[root@localhost ~]# vi /etc/anacrontab
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# 前面的内容和 /etc/crontab 文件类似

# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# 最大随机延迟

# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22
# anacron 的执行时间范围是 03:00—22:00

# period in days  delay in minutes  job-identifier  command
1  5  cron.daily    nice run-parts /etc/cron.daily
7  25 cron.weekly   nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly
# 天数 强制延迟(分) 工作名 实际执行的命令
# 当时间差超过天数时,强制延迟多少分钟之后就执行命令
在这个文件中,RANDOM_DELAY 定义的是最大随机延迟,也就是说,cron.daily 工作如果超过 1 天没有执行,就并不会马上执行,而是先延迟强制延迟时间,再延迟随机延迟时间,之后再执行命令;START_HOURS_RANGE 定义的是 anacron 的执行时间范围,anacron 只会在这个时间范围内执行。

我们用 cron.daily 工作来说明 /etc/anacrontab 的执行过程:
大家会发现,/etc/cron.{daily,weekly,monthly} 目录中的脚本在当前的 Linux 系统中是被 anacron 调用的,不再依靠 cron 服务。

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

例如,笔者更加习惯让定时任务在凌晨 03:00—05:00 执行,可以进行如下修改:
[root@localhost ~]# vi /etc/anacrontab
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=0
# 把最大随机延迟改为 0 分钟,不再随机延迟

# the jobs will be started during the following hours only
START_HOURS_RANGE=3-5
# 执行时间范围为 03:00—05:00

# period in days  delay in minutes  job-identifier  command
1  0  cron.daily    nice run-parts /etc/cron.daily
7  0  cron.weekly   nice run-parts /etc/cron.weekly
@monthly 0 cron.monthly nice run-parts /etc/cron.monthly
# 把强制延迟也改为 0 分钟,不再强制延迟
这样,所有放入 /etc/cron.{daily,weekly,monthly} 目录中的脚本都会在指定时间执行,而且也不怕服务器万一出现关机的情况了。

相关文章