首页/安全/取证与溯源速查/systemd timer 排查
Linux 取证135 条

systemd timer 排查

systemd timer 正在取代 cron:OnCalendar、OnBootSec 等触发规则保存在单元文件里,list-timers 可看到下次与上次触发时间。

取证与溯源速查安全更新于 2026-10-13

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上次触发时刻与距今间隔与日志对不上说明执行失败或被跳过
UNITtimer 单元名需进一步落到实际文件路径与来源
ACTIVATES由该 timer 启动的单元通常为 .service,要一并核查其内容
系统单元与用户单元的范围不同:用户级 timer 放在 ~/.config/systemd/user/ 下,需要加 --user 参数才列出,普通排查里这一批最容易被整体漏掉。系统级 timer 与 crontab 可能同时存在,同一任务被两套机制重复执行时,日志中会出现成对的相同记录,定位时不要误判为两次独立投递。
被停用的 timer 未必不会运行:它仍可能被其他单元的依赖带动或被手工启动,判断是否存在定时持久化时,要同时看启用状态、最近触发记录与执行日志三者。

易错点

  • 只查 crontab 不看 systemd timer,漏掉定时持久化的主要新位置
  • 扫一眼 NEXT 列就下结论,忽略 LAST 与执行日志之间的差异
  • 漏查用户级单元,--user 下的 timer 完全看不到
  • 同名单元未注意 /etc 覆盖 /usr/lib 的优先级,误读真正生效的配置

数据来源与参考

  • systemd.timer 官方文档(systemd.timer(5))
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌