systemd timer 教程:比 cron 更可靠的定时任务
摘要
systemd timer 是 cron 的现代替代品:错过的任务开机自动补跑,日志直接进 journalctl。本教程依据 systemd 官方文档,介绍 service+timer 成对写法、OnCalendar 日历表达式、list-timers 查看计划、systemd-analyze 验证,以及与 cron 的选型对比。
systemd timer 定时任务教程:cron 的现代替代品
cron 是经典,但它不会在服务器关机期间补跑错过的任务,日志也要去翻。systemd timer 是 systemd 原生的定时任务方案:错过的任务开机自动补跑、日志直接进 journalctl、依赖管理一体化。本教程依据 systemd 官方文档整理。
一、一个 timer 由两个文件组成
以"每天凌晨 2 点备份数据库"为例,在 /etc/systemd/system/ 下建两个文件。
backup.service(做什么):
backup.timer(什么时候做):
Type=oneshot 表示这是跑完就退的一次性任务;Persistent=true 就是"错过补跑"的开关——停机期间错过的任务会在下次开机后立即执行。
二、启用与查看
list-timers 会显示每个任务"下次什么时候跑、上次什么时候跑",比翻 cron 日志直观得多。
三、OnCalendar 时间语法
OnCalendar 用的是日历式表达,比 cron 五字段好读:
表达式 | 含义 |
|---|---|
| 每天 02:00 |
| 每 15 分钟 |
| 工作日每天 9 点 |
| 每月 1 号零点 |
| 每周日 3 点 |
写完可以先验证:systemd-analyze calendar "Mon..Fri 09:00" 会打印出未来几次触发时间。
四、与 cron 怎么选
对比项 | cron | systemd timer |
|---|---|---|
错过补跑 | 不支持 |
|
日志 | 邮件/自配 | journalctl 直接看 |
随机延迟 | 手写 sleep |
|
资源限制 | 无 | 加 MemoryMax 等参数 |
上手难度 | 一行搞定 | 需要两个文件 |
简单的一次性小任务,cron 一行更省事;生产环境和备份类任务,timer 的补跑和日志是实打实的优势。两者共存也没问题。
五、看执行日志
六、总结
需求 | 做法 |
|---|---|
定时执行 |
|
每天几点 |
|
错过补跑 |
|
查看计划 |
|
看日志 |
|
验证表达式 |
|
把本站 Bash 备份脚本的 crontab 换成 timer + Persistent,服务器再怎么重启,备份也一次不落。
