anacron 与 anacrontab
/etc/anacrontab 是 anacron 的任务表,用来补跑按天及以上粒度的批任务:机器关机错过的任务,开机后会按“距上次运行已过几天”决定是否补跑。它只支持天级周期,不保证精确时刻,所以常与 cron 配合使用。RHEL 系由 cronie-anacron 提供,Debian/Ubuntu 是 anacron 包,两者配置格式一致。
基本信息
| 适用平台 | RHEL/CentOS(cronie-anacron)、Debian/Ubuntu(anacron) |
|---|---|
| 配置路径 | /etc/anacrontab;Debian 系另有 /etc/cron.d/anacron |
| 四列格式 | 周期天数 延迟分钟 任务标识 命令 |
| 运行记录 | /var/spool/anacron/<任务标识>(记录上次运行日期) |
| 常用变量 | RANDOM_DELAY、START_HOURS_RANGE、SHELL、PATH、MAILTO |
| 周期写法 | 数字表示天数,也可用 @daily、@weekly、@monthly |
典型使用场景
- 非 7x24 开机的设备(办公机、边缘盒子)需要“错过就补跑”的定时任务
- 每日日志轮转、备份、报表生成希望开机后自动补做
- 用 RANDOM_DELAY 与 START_HOURS_RANGE 把批任务错峰到低峰时段
- 与 systemd timer 的 Persistent=true 对照选型
- 排查“今天的定时任务没跑”:先看时间戳文件与 cron 日志
示例与查看
示例与查看
cat /etc/anacrontab # 全局表:先看清现有条目与变量
# 文件内变量(写在条目之前)
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
RANDOM_DELAY=45 # 额外随机 0-45 分钟延迟,避免同时开跑
START_HOURS_RANGE=3-22 # 只在 03:00-22:59 之间执行
# 周期 延迟 标识 命令
1 5 cron.daily run-parts --report /etc/cron.daily
7 10 cron.weekly run-parts --report /etc/cron.weekly
ls -l /var/spool/anacron/ # 时间戳文件:记录每个标识上次运行日期
journalctl -u crond --no-pager | grep -i anacron | tail # RHEL 系从 cronie 日志里看
grep -i anacron /var/log/syslog | tail # Debian 系通常在 syslog四列格式读法
| 列 | 含义 | 易错点 |
|---|---|---|
| 周期 | 数字为天数,也可写 @daily/@weekly/@monthly | 天级是最小粒度,别指望小时级;写 0 或负数无意义 |
| 延迟 | anacron 启动后等待多少分钟再执行 | 目的是错峰,写 0 容易与其他任务撞在同一时间 |
| 任务标识 | 对应 /var/spool/anacron 下的时间戳文件名 | 改名等于丢失运行记录,可能立刻触发一次补跑 |
| 命令 | 要执行的命令,常配合 run-parts 扫目录 | 环境变量来自本文件,不是登录环境;输出受 MAILTO 控制 |
任务标识是补跑判断的唯一依据:改名后 anacron 找不到旧时间戳,会当成从未运行而立刻补跑一次。改动前先确认这一步的副作用(是否幂等、会不会重复推送)可以接受。
当前时间不在 START_HOURS_RANGE 内时,任务会推迟到下一个窗口开始而不是被放弃;另外错过的周期不会累计补跑多次,每个周期最多补一次。