用 systemd timer 替掉 cron 之后
倒不是说 cron 不好。只是有一次备份脚本失败了两周才被发现——因为 cron 的报错只发到本地邮箱,而我从来没配过 MTA。
换成 systemd timer 之后,起码不用再猜它到底跑没跑。
一个最小的例子
先写 service:
# /etc/systemd/system/backup.service
[Unit]
Description=Nightly backup
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
再写 timer:
# /etc/systemd/system/backup.timer
[Unit]
Description=Run backup every night
[Timer]
OnCalendar=*-*-* 03:30:00
Persistent=true
[Install]
WantedBy=timers.target
Persistent=true 是我最喜欢的一项:如果那会儿机器在重启或者关机,开机后会补跑一次。cron 的 anacron 也能做,但配置起来麻烦多了。
日志直接看
systemctl list-timers
journalctl -u backup.service --since yesterday
失败的话 systemctl status backup.service 会告诉你退出码,标准错误也在 journal 里。比翻 /var/log/cron 舒服。
一点不方便
要临时改时间得 daemon-reload,不像 crontab 那样改完就生效。脚本多了以后 unit 文件也会变多,得注意命名。
现在这台机器上跑着四个 timer:备份、证书续期检查、日志清理、还有一个小监控。暂时没想换回去。