把 cron 换成 timer 之后踩到的四个坑
迁移动机很简单:cron 没有日志归属,失败也不重试。timer 有 OnFailure、有随机延迟、有 journal 记录。但换过去之后连着踩了四个坑。
第一个是精度。OnCalendar 默认允许最多一分钟的误差,加上 Persistent=true 之后的补跑,实际执行时间会很散。需要准点就得配 AccuracySec=1s。
第二个是并发。cron 靠 flock 的基本没有,timer 不会自动阻止重叠执行——上一次还没跑完,下一次已经起来。加 unit 里的 Type=oneshot 不解决这个问题,得靠 RuntimeMaxSec 或者脚本自带的锁。
第三个是日志归属。timer 触发的服务,journal 里 unit 名是 xxx.service 而不是 timer 名,排查时容易找错地方。
第四个最坑:ExecStart 里的 % 是说明符前缀,写日期格式 `date +%Y%m%d` 会被解析成别的意思。必须写成 %%。这个错误没有任何提示,只会看到命令行为异常。