以前定时任务都丢在 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。