温馨提示×

ubuntu定时器为何延迟执行

小樊
45
2026-10-01 04:20:07
栏目: 智能运维

在 Ubuntu(以及大多数 Linux 系统)上,**“定时器延迟执行”**通常不是 bug,而是由系统机制或配置方式导致的。下面按常见原因系统说明,并给出排查方法。


一、使用 cron 时的延迟原因

1. cron 的最小时间单位是分钟

*/5 * * * * /path/script.sh
  • cron 不会在秒级触发
  • 实际执行时间可能是 :00、:05,但系统负载高时会延后几秒到几十秒

✅ 如果你需要秒级定时,请用 systemd timer 或 sleep 循环。


2. cron 环境变量极少

cron 执行时:

  • 没有完整 PATH
  • 没有用户登录环境
  • 没有网络可能还没起来

⚠️ 表现:

  • 脚本“看起来没执行”
  • 实际是命令找不到或依赖未就绪

✅ 建议:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
* * * * * /bin/bash /path/script.sh >> /var/log/cron.log 2>&1

3. 系统时间不准确(NTP 未同步)

如果:

  • 虚拟机刚启动
  • 休眠/唤醒
  • 没开 NTP

cron 可能基于“错误时间”触发

✅ 检查:

timedatectl

✅ 开启同步:

sudo timedatectl set-ntp true

二、使用 systemd timer 时的延迟原因(非常常见)

1. OnCalendar 的语义

[Timer]
OnCalendar=*-*-* 02:00:00
  • 如果系统 02:00 已开机但刚启动
  • 或 当时处于 suspend
  • timer 可能延迟到下次触发

✅ 想“错过也补执行”:

Persistent=true

2. 系统处于挂起 / 休眠

systemd timer 默认不会在唤醒后立刻补执行

✅ 解决:

  • 使用 WakeSystem=true
  • 或配合 systemd-inhibit

3. AccuracySec 导致“故意延迟”

AccuracySec=1min

systemd 会合并定时器,节省资源

✅ 精确执行:

AccuracySec=1s

4. 服务未启用

很多人只启用了 .service,忘了 .timer

✅ 检查:

systemctl list-timers

✅ 启用:

systemctl enable --now mytimer.timer

三、系统负载 / IO 阻塞

即使定时器触发了:

  • CPU 满载
  • 磁盘 IO 高
  • 内存不足

脚本也会排队延迟执行

✅ 查看:

top
iostat
journalctl -u your.service

四、你“以为延迟”,其实没触发

常见误区:

  • 日志没写
  • 脚本路径错
  • 权限不足
  • 没加可执行权限

✅ 快速验证:

* * * * * date >> /tmp/cron_test.log

五、如何定位你的问题(建议自检清单)

  1. 用的是 cron 还是 systemd timer?
  2. 延迟是 几秒 / 几分钟 / 几小时?
  3. 是 每次都延迟 还是 偶尔?
  4. 系统是否 休眠 / 虚拟机 / 容器?
  5. 日志里是否 根本没触发?

如果你愿意,可以把:

  • 定时器配置(cron 或 timer)
  • 系统版本(ubuntu 20.04 / 22.04)
  • 延迟现象描述

贴出来,我可以帮你精确判断是哪一种原因。

0 踩