用 systemd timer 替代 cron
以前定时任务都丢在 crontab 里,出了问题只能去翻邮件或者自己写日志。后来逐步换成了 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 nightly
[Timer]
OnCalendar=*-*-* 03:00:00
RandomizedDelaySec=15min
Persistent=true
[Install]
WantedBy=timers.target
systemctl daemon-reload
systemctl enable --now backup.timer
systemctl list-timers backup.timer
比 cron 好在哪
- 输出自动进 journal,
journalctl -u backup.service就能看到每次运行的日志和退出码。 Persistent=true:计划时间机器正好关着,开机后会补跑一次。RandomizedDelaySec可以把多台机器的任务错开,避免同时把 NAS 打满。- 可以用
After=、Requires=声明依赖,比如等网络存储挂载好了再跑。
想手动触发一次,直接 systemctl start backup.service。