systemd timer 排查
systemd timer 正在逐步取代 cron:触发规则写在与服务配对的 .timer 单元里,OnCalendar 描述日历式定时,OnBootSec 与 OnUnitActiveSec 描述开机后或上次激活后的间隔触发。systemctl list-timers 能直接看到上次与下次触发时间,比翻 crontab 直观,也让主机持久化排查多了一个必须检查的位置。
基本信息
| 查看命令 | systemctl list-timers --all(含未激活的 timer) |
|---|---|
| 单元位置 | /etc/systemd/system/、/usr/lib/systemd/system/,用户级在 ~/.config/systemd/user/ |
| 常用指令 | OnCalendar、OnBootSec、OnUnitActiveSec、Persistent |
| 配对关系 | .timer 与同名 .service 配合,也可用 Unit= 指向其他单元 |
| 优先级 | 同名单元 /etc 路径优先于 /usr/lib,排查以 /etc 为主 |
典型使用场景
- 排查定时执行的持久化任务,补上 crontab 之外的位置
- 确认某次定时动作的具体触发时刻与实际执行结果
- 核对单元文件来自发行版自带,还是事后新增的
- 检查已停用的 timer 是否仍会被依赖或手工启动
- 与 journald 日志对齐,查看定时任务的执行输出
- 对比 timer 与 crontab 的覆盖范围,确认既定任务由哪一套机制执行
查看与核对
查看与核对
systemctl list-timers --all --no-pager | head -20 # 全部 timer 的上次与下次触发
systemctl cat audit-clean.timer # 单元内容与文件来源路径
systemctl list-timers --all --no-pager | awk '{print $1,$2,$3,$NF}' # 只取触发时间与单元名
ls -lt --time-style=long-iso /etc/systemd/system/ | head -20 # 近期新增或修改的单元
journalctl -u audit-clean.service --since today | tail # 定时任务的实际执行日志list-timers 列读法
| 列 | 含义 | 异常参考 |
|---|---|---|
| NEXT / LEFT | 下次触发时刻与剩余时间 | 长期 far in the future 要回头看触发表达式 |
| LAST / PASSED | 上次触发时刻与距今间隔 | 与日志对不上说明执行失败或被跳过 |
| UNIT | timer 单元名 | 需进一步落到实际文件路径与来源 |
| ACTIVATES | 由该 timer 启动的单元 | 通常为 .service,要一并核查其内容 |
系统单元与用户单元的范围不同:用户级 timer 放在 ~/.config/systemd/user/ 下,需要加 --user 参数才列出,普通排查里这一批最容易被整体漏掉。系统级 timer 与 crontab 可能同时存在,同一任务被两套机制重复执行时,日志中会出现成对的相同记录,定位时不要误判为两次独立投递。
被停用的 timer 未必不会运行:它仍可能被其他单元的依赖带动或被手工启动,判断是否存在定时持久化时,要同时看启用状态、最近触发记录与执行日志三者。