AI多Agent协作系统实战(十):同一份报告刷屏3小时——Cron定时任务的“幽灵重复“之谜
系列第10篇 | 为什么心跳报告每隔5分钟就重复发送同一份内容追踪一个隐藏在时间格式中的Bug前言今天凌晨发现飞书群里每隔5分钟就收到一条相同的心跳报告持续了3个多小时。内容一模一样任务状态一模一样就像一个幽灵在重复发送同一条消息。这到底是怎么发生的为什么定时任务会重复执行为什么节流throttle机制没有生效追踪下去发现了一个隐藏在时间格式中的致命Bug。一、事件经过1.1 发现报告重复用户发消息“怎么一直在重复的报这个啥问题”报告内容【小密统筹报告 06-30 07:02】 整体进度0/1 0% | # | 任务ID | 完善内容 | 开发 | 测试 | |---|--------|----------|------|------| | 1 | FIX-SERVICE-CREATE-BOTTOM-GAP-COLOR-0629-V3 | 工单创建底部间距颜色V3修复 | ⏳ | - |每隔5分钟就发一次从07:02开始一直持续到10点多。1.2 检查Cron Job检查心跳cronjobcronjob list发现cronjob正常运行每5分钟触发一次。但问题是为什么每次触发都输出相同的内容1.3 检查节流机制心跳脚本有节流逻辑# 检查节流文件throttle_file/tmp/hermes-heartbeat-throttleifos.path.exists(throttle_file):withopen(throttle_file,r)asf:last_runfloat(f.read().strip())iftime.time()-last_run300:# 5分钟内不重复returnNone理论上5分钟内不应该重复输出。但实际却重复了。1.4 发现时间格式Bug检查节流文件cat/tmp/hermes-heartbeat-throttle输出20260630_001831这是一个字符串不是时间戳问题根源节流文件存储的是字符串格式的时间20260630_001831而不是Unix时间戳1782774517。last_runfloat(20260630_001831)# ValueError!float()无法解析这个字符串抛出异常。异常被try-except捕获节流检查被跳过每次都执行。1.5 修复Bug修复节流逻辑# 修复前throttle_file/tmp/hermes-heartbeat-throttleifos.path.exists(throttle_file):withopen(throttle_file,r)asf:last_runfloat(f.read().strip())iftime.time()-last_run300:returnNone# 修复后throttle_file/tmp/hermes-heartbeat-throttleifos.path.exists(throttle_file):try:withopen(throttle_file,r)asf:contentf.read().strip()# 兼容两种格式时间戳和字符串ifcontent.isdigit():last_runfloat(content)else:# 字符串格式转换为时间戳fromdatetimeimportdatetime last_rundatetime.strptime(content,%Y%m%d_%H%M%S).timestamp()iftime.time()-last_run300:returnNoneexceptException:pass# 解析失败跳过节流同时修复写入节流文件的代码确保写入Unix时间戳# 修复前withopen(throttle_file,w)asf:f.write(datetime.now().strftime(%Y%m%d_%H%M%S))# 修复后withopen(throttle_file,w)asf:f.write(str(time.time()))二、技术分析2.1 节流机制的原理Cron触发 → 检查节流文件 → ├── 文件存在且5分钟 → 跳过 └── 文件不存在或5分钟 → 执行 → 写入节流文件2.2 Bug的传播链时间格式字符串 → float()解析失败 → 异常被捕获 → 节流检查被跳过 → 每次都执行 → 报告重复2.3 为什么持续3小时Cron每5分钟触发一次每次触发都输出报告用户没有及时发现直到用户手动检查才发现三、经验总结3.1 时间格式要统一内部计算用Unix时间戳time.time()存储和显示用ISO格式datetime.now().isoformat()不要混用两种格式3.2 异常处理要谨慎# ❌ 错误异常被静默吞掉try:last_runfloat(content)except:pass# 节流失效但没有日志# ✅ 正确异常要记录日志try:last_runfloat(content)exceptExceptionase:logger.warning(f节流文件解析失败:{e})# 可以选择跳过节流但要记录3.3 节流机制要健壮支持多种时间格式解析失败时有默认行为记录日志便于排查3.4 监控重复输出检测短时间内相同内容的重复输出超过阈值时报警自动暂停重复的cronjob四、涉及文件文件修改内容xiaomi_heartbeat_check.py修复节流逻辑兼容多种时间格式throttle_file确保存储Unix时间戳

相关新闻

Python实现轻量级IP防火墙:从原理到实战的网络安全防护

Python实现轻量级IP防火墙:从原理到实战的网络安全防护

1. 项目概述与核心价值 最近在梳理自己负责的几个Web应用的安全基线时,我重新审视了服务器层面的防护策略。很多开发者,尤其是中小型项目的负责人,往往把安全重心放在应用层的漏洞扫描和代码审计上,这当然没错,但服务器…

2026/11/13 16:18:38 阅读更多 →
网盘直链下载助手完整指南:告别限速困扰,9大平台一键获取真实下载地址

网盘直链下载助手完整指南:告别限速困扰,9大平台一键获取真实下载地址

网盘直链下载助手完整指南:告别限速困扰,9大平台一键获取真实下载地址 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里…

2026/11/14 3:08:19 阅读更多 →
CentOS下安装MySQL8.0完整指南

CentOS下安装MySQL8.0完整指南

一、安装方式对比 安装方式适用场景优点缺点包管理器安装 (apt/yum/dnf)快速部署、追求稳定性、新手友好自动处理依赖、配置简单、易于升级维护版本可能较旧、定制化程度低手动编译安装需要特定版本、深度定制、学习原理版本可控、性能优化灵活、功能模块可选步骤繁琐、依赖管…

2026/11/7 21:43:01 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/14 5:13:29 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/14 5:13:29 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/14 5:13:29 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/13 22:08:41 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/14 2:41:37 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/14 5:13:29 阅读更多 →

日新闻

周新闻

月新闻