机柜 / U40
调度 · 2026-07-03 · 6 分钟
crontab 和 systemd timer
cron 很老,也足够。它不管你开机没开机,错过了就是错过了。适合:日志切割、缓存预热、那些晚十分钟也没人死的事。
systemd timer 认账。机器在窗口里关机,起来之后它会补跑——如果你写了 Persistent=true。这不是体贴,这是承诺。承诺之前先问:补跑会不会把积压一次性倒进生产。
我怎么选
- 任务可以丢一次:cron。少一个守护进程,少一份单元文件。
- 任务必须发生,且要有日志、超时、失败状态:timer + service。
- 任务会跑很久:不要让 cron 叠跑。timer 用
RefuseManualStart没必要,用flock或Type=oneshot加锁。
# /etc/systemd/system/rotate-certs.timer
[Timer]
OnCalendar=Tue *-*-* 04:10:00
Persistent=true
RandomizedDelaySec=8min
RandomizedDelaySec 是给机房里那几十台一起醒过来的礼貌。没有它,整排机器会在 04:10:00 同时去抢同一个上游。
调试时看 systemctl list-timers,不要看 crontab 注释。注释会撒谎,timer 的 LAST 和 NEXT 不会。
能迟到的任务用 cron;必须醒来的任务用 timer。把这句话写在单元文件上头。
U40 · 绿线,调度。