用 systemd timer 替掉 cron 之后踩的两个坑
把备份脚本从 crontab 挪到 systemd timer,本以为是一对一翻译,结果踩了两个坑。
Persistent 的补跑不是你想的那样
Persistent=true 只补一次,而且是在开机后立刻补,不会按原定时间顺延。脚本定在 03:30,机器凌晨四点重启,起来就把备份跑了,正好撞上开机时的磁盘扫描,IO 打满十分钟。后来加了 After=network-online.target 和一次短 sleep 才稳定。
改了 unit 不 reload,timer 还在跑旧定义
把 OnCalendar 从每天改成每周,systemctl list-timers 里显示的是新时间,实际触发的还是旧规则——timer 进程没重载。改完必须:
systemctl daemon-reload
systemctl restart backup.timer
还有两个细节。OnCalendar 用的是系统时区,容器里经常是 UTC,写 03:30 实际是北京时间 11:30;systemd-analyze calendar '*-*-* 03:30:00' 能直接看出下一次触发的绝对时间。RandomizedDelaySec 适合打散同时启动的任务,但会让“准点”不再成立,备份别加。