这台服务器上有三个 cron 都不需要写的地方:证书续期、站点统计、每日备份,全部由 systemd timer 驱动。这篇把我配置它们时的笔记整理出来——尤其是那些官方文档里写了但我一开始没看懂的部分。
为什么是 timer 而不是 cron
最直接的理由有两个。Persistent=true:服务器重启错过的时间点会补跑,半夜的备份不会因为一次宕机凭空消失。其次是日志:每个 timer 任务的输出自动进 journal,journalctl -u xxx.service 一查便知,不用自己维护日志文件和轮转。
我的三个 OnCalendar
# 证书检查:每天两次(certbot 官方推荐节奏)
OnCalendar=*-*-* 00/12:00:00
# 站点统计:每 5 分钟
OnCalendar=*:0/5
# 站点备份:每天 09:58,带 30 秒随机抖动
OnCalendar=*-*-* 09:58:00
RandomizedDelaySec=30
第三行那个 30 秒抖动是踩坑换来的习惯:固定整点的定时任务在全世界都在整点醒来的云上,会制造不必要的拥堵。
钩子:让动作连成链
证书续期完要让 nginx 知道。certbot 的 renewal-hooks/deploy 目录里放一个两行的脚本,续期成功自动 reload。同理,统计任务在生成 stats.json 之后顺手重建搜索索引和相关度地图——上游任务的产出,就是下游任务的输入,用 ExecStart 顺序串起来即可,不需要任何消息队列。
自动化最好的标志不是炫技,是你想不起来上一次手动做它是什么时候。
查岗命令备忘
systemctl list-timers --all # 谁在跑、下次何时跑
journalctl -u woshale-backup.service # 某个任务的全部历史
systemctl start xxx.service # 手动触发一次(试运行首选)
首页控制台上的那条"定时备份已创建",就是这套体系每天在 journal 里留下的脚印。自动化不神秘,它只是把"记得去做"这件事,从你的大脑外包给了内核。