/etc/cron 体系与 anacron
定时任务在 Linux 上分散在多处:/etc/crontab 是系统级表且每行比用户表多一个用户名段,/etc/cron.d/ 下的文件使用同样格式,/etc/cron.hourly、daily、weekly、monthly 目录里的脚本由 run-parts 按周期执行,/etc/anacrontab 则用间隔天数与延迟时间描述任务。逐处核对才算完整,只查一个位置必然漏项。
基本信息
| 主要位置 | /etc/crontab、/etc/cron.d/、/etc/cron.{hourly,daily,weekly,monthly}/、/etc/anacrontab |
|---|---|
| 执行机制 | 周期目录内的脚本由 run-parts 调用,需要可执行权限与合规文件名 |
| 用户级任务 | 存放在 /var/spool/cron/ 或 /var/spool/cron/crontabs/ 下 |
| 执行日志 | 部分发行版默认不记录 cron 执行结果,需单独开启 |
| 权限要求 | cron.d 文件需正确属主与权限,否则会被静默跳过 |
典型使用场景
- 排查服务与 timer 之外的定时型持久化
- 定位某次周期性行为由哪个任务触发
- 核对周期目录里的脚本是否为近期新增或被改写
- 判断某个任务以哪个用户身份执行
- 与执行记录对照,确认任务是否真的运行过
清点与核对
清点与核对
grep -v '^#' /etc/crontab | grep -v '^$' # 系统主表,注意多一个用户名列
ls -la /etc/cron.d/ /etc/cron.hourly/ /etc/cron.daily/ # 清点目录任务与权限
ls -la /var/spool/cron/ /var/spool/cron/crontabs/ 2>/dev/null # 用户级任务
find /etc/cron.d /etc/cron.daily -newermt '-30 days' -type f # 近期改动或新增的任务
grep -v '^#' /etc/anacrontab # 间隔天数与延迟时间描述位置与差别
| 位置 | 格式特点 | 注意点 |
|---|---|---|
| /etc/crontab | 五段时间加用户名加命令 | 多出的用户名段最容易看错 |
| /etc/cron.d/ | 与系统主表相同格式 | 属主或权限不正确会被静默跳过 |
| cron.hourly 等目录 | 脚本文件,由 run-parts 调用 | 文件名需符合命名规则才会执行 |
| /etc/anacrontab | 间隔天数与延迟分钟 | 语法与 crontab 表达式不是一套 |
run-parts 会忽略名称不合规的文件,例如带扩展名或含点号的脚本。放进去看起来像正常任务的脚本可能根本不会执行;判断一个任务是否真的落地运行,要同时看命名、权限与实际执行记录。
把新增的 cron 脚本当成正常运维任务忽略是常见失误:周期目录下的脚本以 root 身份运行,运行前不产生任何交互痕迹。排查持久化时这些脚本必须逐个打开阅读内容,而不是只看文件名。