systemd timer 教程：比 cron 更可靠的定时任务

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