在 Ubuntu(以及其它使用 systemd 的 Linux 发行版)里,**“定时器重复”**通常不是 bug,而是由 systemd timer 的工作机制 决定的。下面把常见原因一次说清楚,并给出对应的解决办法。
OnCalendar(日历触发)如果你配置了类似:
[Timer]
OnCalendar=*-*-* 02:00:00
这表示 每天 02:00 都会触发一次,这是“重复”的,而且是正常的。
✅ 解决:
Oneshot:[Service]
Type=oneshot
ExecStart=/path/to/script.sh
或者
systemd-run --once(不写 timer 文件)OnBootSec / OnStartupSec例如:
[Timer]
OnBootSec=5min
这表示 每次开机 5 分钟后执行,不是“每隔 5 分钟”。
如果你想要“每 5 分钟一次”,应该用:
OnUnitActiveSec=5min
或:
OnCalendar=*:0/5
[Service]
Type=simple
ExecStart=/path/script.sh
如果 script.sh 没有退出(比如有死循环、等待输入、sleep 很久),那么:
✅ 解决:
Type=oneshot
Persistent=true 导致“补执行”[Timer]
OnCalendar=daily
Persistent=true
如果系统关机时错过了触发时间,开机后会立即补一次。
✅ 如果你不想要“补执行”:
Persistent=false
systemctl list-timers 显示多条例如:
Mon 2026-01-12 02:00:00 - Mon 2026-01-11 02:00:00 mytimer.timer
这只是“下一次 / 上一次”时间,不是重复执行。
很多人:
/etc/cron.d 里写了结果:看起来像是重复执行
✅ 检查:
crontab -l
ls /etc/cron.*
systemctl list-timers
journalctl -u mytimer.service
journalctl -u mytimer.timer
systemctl show mytimer.service -p NRestarts
Ubuntu 定时器“重复”,99% 是因为:
- 配置了周期性触发
- 或脚本没退出
- 或 Persistent 补执行
- 或 cron 和 timer 重复
如果你愿意,可以把你的:
.timer.service贴出来,我可以直接帮你指出是哪一条导致的“重复”。