用 systemd timer 替掉 cron 之后
上个月有台机器上的备份任务连着三周没跑,我一直不知道。cron 干这种事一点声响都没有 —— 它不关心上周的进程是成功了、崩了、还是压根没启动。
后来把那批任务全换成了 systemd timer。倒不是说它多先进,主要是它默认就会记录每次执行的结果。
一个最小的 timer
[Unit]
Description=每晚备份
[Timer]
OnCalendar=*-*-* 03:30:00
Persistent=true
[Install]
WantedBy=timers.target
Persistent=true 这个选项值得单独说:如果机器在 03:30 时是关着的,开机后 systemd 会补跑一次。cron 要自己装 anacron 才能做到类似的事。
失败能被看见
对应的 service 里加一行 OnFailure=,任务挂了就能触发一个通知单元。再配合 systemctl list-timers,一眼就能看出下次什么时候跑、上次跑成什么样。
systemctl list-timers --all
journalctl -u backup.service -n 50
几个容易踩的坑
第一,timer 单元和 service 单元必须同名。写了个 backup.timer 但 service 叫 backup-job.service,它就找不到要拉起谁。
第二,OnCalendar 的语法和 cron 不一样,别按 cron 的习惯写。*-*-* 03:30:00 是每天三点半,Mon..Fri 可以限定工作日。
第三,改完 timer 要先 daemon-reload,再 enable --now。只 enable 不启动的话,它要等到下次开机才生效。
换过来之后最直观的感受是:出问题的时候不用靠猜了。