做工控上位机的,谁没经历过凌晨的夺命电话?
“监控画面不动了,数据不刷新了,你们赶紧来人!”
半夜跑过去一看,程序进程还在任务管理器里挂着,界面点啥都没反应,通信停了,采集断了,整个系统僵死在那。只能强制结束进程,重新启动,前后折腾半小时,生产停了半小时,锅还得你背。
很多人会说,加个看门狗啊。但绝大多数人用的都是进程级看门狗——检测到进程没了就重启。可工业现场90%的程序卡死,都不是进程退出,而是线程死锁、UI阻塞、死循环。人活着,但是瘫了,进程级看门狗根本没用。
去年在一个汽配厂涂装线项目上就被这问题坑惨了。程序平均每周卡个一两次,都是凌晨出问题,每次都要运维跑现场重启。后来专门花了一周重构了监控体系,做了一套线程级看门狗+分级自动重启的机制。从那之后,程序连续跑了八个月,除了系统更新,从来没人工重启过。现场运维的师傅都说,以前天天守着电脑,现在基本不用管。
今天就把这套方案完整分享出来,不用第三方组件,纯代码实现,嵌入现有项目就能用。
一、为什么你加的看门狗没用?
很多人对看门狗的理解还停留在“进程没了就重启”,这在桌面软件里可能够用,但在工业上位机场景里,远远不够。
工业程序的卡死,九成以上都是“假死”——进程还在,业务已停。最常见的三种场景:
- UI线程阻塞:耗时操作不小心写在UI线程里,或者控件跨线程调用死锁,界面白屏点不动,但后台进程还在运行
- 关键工作线程死锁:比如通信线程和数据处理线程互相等待,采集停了数据不刷新,但界面看起来