温馨提示×

ubuntu定时器为何重复

小樊
36
2026-09-25 08:08:48
栏目: 智能运维

在 Ubuntu(以及其它使用 systemd 的 Linux 发行版)里,**“定时器重复”**通常不是 bug,而是由 systemd timer 的工作机制 决定的。下面把常见原因一次说清楚,并给出对应的解决办法。


一、最常见原因:timer 本身就是“周期性”的

1. OnCalendar(日历触发)

如果你配置了类似:

[Timer]
OnCalendar=*-*-* 02:00:00

这表示 每天 02:00 都会触发一次,这是“重复”的,而且是正常的。

✅ 解决:

  • 如果你只想执行一次,用 Oneshot:
[Service]
Type=oneshot
ExecStart=/path/to/script.sh

或者

  • 用 systemd-run --once(不写 timer 文件)

2. OnBootSec / OnStartupSec

例如:

[Timer]
OnBootSec=5min

这表示 每次开机 5 分钟后执行,不是“每隔 5 分钟”。

如果你想要“每 5 分钟一次”,应该用:

OnUnitActiveSec=5min

或:

OnCalendar=*:0/5

二、timer 被“反复触发”的真正原因

3. 服务一直退不出(最常见误区)

[Service]
Type=simple
ExecStart=/path/script.sh

如果 script.sh 没有退出(比如有死循环、等待输入、sleep 很久),那么:

  • systemd 认为 unit 还在 active
  • 某些配置下会不断触发下一次

✅ 解决:

  • 脚本必须是短期执行完
  • 或使用:
Type=oneshot

4. Persistent=true 导致“补执行”

[Timer]
OnCalendar=daily
Persistent=true

如果系统关机时错过了触发时间,开机后会立即补一次。

✅ 如果你不想要“补执行”:

Persistent=false

三、你可能误以为“重复”,其实是正常行为

5. systemctl list-timers 显示多条

例如:

Mon 2026-01-12 02:00:00  -          Mon 2026-01-11 02:00:00  mytimer.timer

这只是“下一次 / 上一次”时间,不是重复执行。


6. cron + timer 同时存在

很多人:

  • 在 /etc/cron.d 里写了
  • 又启用了 systemd timer

结果:看起来像是重复执行

✅ 检查:

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
  • 脚本内容

贴出来,我可以直接帮你指出是哪一条导致的“重复”。

0 踩