尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
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时间戳
RELATED

相关推荐

计算机保研实战指南:从定位、材料到面试的完整规划与经验复盘

计算机保研实战指南:从定位、材料到面试的完整规划与经验复盘

1. 从迷茫到上岸:一个普通计算机保研er的真实心路又到了一年保研季,后台和私信里关于“计算机保研怎么准备”、“某某学校面试问什么”、“现在联系导师还来得及吗”的问题又开始多起来了。作为一个刚刚走完这段路的过来人,我太理解大家此刻的…

📅 2026/9/11 22:42:56
Web安全基础:从SQL注入到XSS攻击的纵深防御实战指南

Web安全基础:从SQL注入到XSS攻击的纵深防御实战指南

1. 项目概述:为什么Web安全是每个开发者的必修课?最近几年,我面试过不少前端和后端工程师,发现一个挺有意思的现象:很多朋友能把框架玩得很溜,业务逻辑写得飞起,但一聊到Web安全,比如…

📅 2026/9/10 2:11:42
论文还能用AI吗:多家期刊发布AI使用规范,研究生先看懂这三条红线

论文还能用AI吗:多家期刊发布AI使用规范,研究生先看懂这三条红线

论文还能用AI吗:多家期刊发布AI使用规范,研究生先看懂这三条红线 写论文用AI,到底算不算学术不端?这个让无数研究生纠结的问题,8月中旬有了越来越明确的答案——期刊们开始"立规矩"了,而规矩的核…

📅 2026/9/11 9:03:58
MORE NEWS

更多资讯

📰

领航杯网络安全竞赛:题库高频考点与避坑指南

简介:面向“领航杯”江苏省青少年网络信息安全知识竞赛参赛者与指导教师的备赛题库,围绕竞赛核心考点整理而成,可作为日常自学与赛前冲刺的参考。内容系统覆盖系统锁定快捷键、数据备份意义、网络攻击分类(阻断/截获)、…

📰

欢乐连连看:数据结构实战教学的综合训练场

简介:本资源是武汉理工大学《数据结构与算法实验》课程的实践项目——“欢乐连连看”完整实现源码包,面向计算机专业本科生及算法初学者,聚焦图搜索、路径匹配与游戏逻辑建模等核心能力训练。压缩包共53个文件,含4个cpp主程序源码…

📰

深入学习printf和scanf函数

笔记以注释形式写入,现在只列举一下大纲吧,感觉有代码的话会更方便理解 看到实际的运作以及结果。printf一 基本用法二 占位符三 输出格式1.限定长度2.总显示正负号3.限定小数位数4.输出部分字符scanf一 基本用法二 返回值三 占位符注意事项四 赋值忽略符…

📰

ArcGIS流场图绘制全攻略:从U/V分量到箭头符号化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

风电功率曲线异常数据清洗:从四种经典方法到贝叶斯变点与风能评估

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

工作三年,才明白Python技术栈要这样学

工作三年,从写爬虫脚本到负责后端服务,我踩过不少坑。刚入行时总想什么火就学什么,结果样样通样样松。后来才明白,Python技术栈的学习必须有一条主线:基础要牢,工具要熟,框架要精,工…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬