systemd timer 是什么
timer 是 systemd 提供的定时触发机制,由一对单元组成:timer 定义什么时候触发,同名 service 定义触发后执行什么,配置里用触发时间表达式代替计划任务的五个星号字段。相比 cron,它的优势是执行记录自动进 journal、支持随机延迟打散并发、支持机器关机期间错过的任务补跑,还能用依赖关系约束执行顺序。需要审计每轮任务的执行结果时,timer 比计划任务更好追溯。
基本信息
| 组成 | 定时单元与业务单元成对,命名建议同名 |
|---|---|
| 触发时间 | 用日历表达式描述,可写具体时刻或周期性时间点 |
| 补跑 | 开启持续性选项后,关机期间错过的任务在开机后补执行 |
| 随机延迟 | 可设置随机延迟秒数,打散集群内的并发压力 |
| 执行记录 | 任务输出与结果进 journal,用单元名过滤即可 |
| 适用平台 | Kylin V10 / UOS 服务器版 / openEuler 等 systemd 系统 |
典型使用场景
- 周期备份:每天固定时刻执行备份脚本,并保留每轮执行结果
- 日志与缓存清理:按周执行清理任务,避免磁盘被逐步写满
- 证书与授权到期检查:定期巡检并提前告警
- 错峰执行:同一批机器设置随机延迟,避免整点集中打满存储与带宽
- 错过补跑:夜间停机维护的机器开机后自动补跑该做的任务
- 需要审计的场景:每轮任务的输出都自动留档,便于事后追溯
定时单元示例
定时单元示例
[Unit]
Description=Daily backup timer # 单元描述
[Timer]
OnCalendar=*-*-* 02:30:00 # 每天 02:30 触发
Persistent=true # 错过的时间点在开机后补跑
RandomizedDelaySec=300 # 最多随机延迟 5 分钟,打散并发
Unit=backup.service # 指定要触发的业务单元
[Install]
WantedBy=timers.target # 挂进定时器目标,enable 后生效配套业务单元与启用
配套业务单元与启用
[Unit]
Description=Daily backup job
[Service]
Type=oneshot # 一次性任务,执行完即结束
ExecStart=/opt/scripts/backup.sh # 必须写绝对路径启用与核对
启用与核对
systemctl daemon-reload # 新增单元后必须重载
systemctl enable --now backup.timer # 启用并立即纳入调度
systemctl list-timers --all # 看下次触发时间与上次结果
systemctl start backup.service # 手工触发一次,验证脚本可跑
journalctl -u backup.service -n 50 --no-pager # 查执行记录与输出定时单元未显式指定业务单元时,systemd 会按同名约定去找对应的服务单元;名称对不上又没显式指定,就会出现定时器启用了却永远不触发的现象。核对时用列出命令看下次触发时间是否合理,比翻配置文件更快。
一次性任务要用一次性类型,否则 systemd 会按常驻服务管理,执行完就判定为失败;需要补跑错过的任务必须开启持续性选项,只写触发时间在停机期间不会留下任何痕迹。