1.1 踩坑案例
踩坑的程序是个常驻的Agent类管理进程, 包括但不限于如下类型的任务在执行:
- a. 多线程的网络通信包处理
- 和控制Master节点交互
- 有固定Listen端口
- b. 定期作业任务, 通过subprocess.Pipe执行shell命令
- c. etc
发现坑的过程很有意思:
- a.重启Agent发现Port被占用了
- => 立刻 想到可能进程没被杀死, 是不是停止脚本出问题
netstat -tanop|grep port_number
- => 调试环境, 直接杀掉占用进程了之, 错失首次发现问题的机会
- => 立刻 想到可能进程没被杀死, 是不是停止脚本出问题
- b.问题 在一段时间后 重现 , 重启后Port还是被占用
- 定位问题出现在一个叫做xxxxxx.sh的脚本, 该脚本占用了Agent使用的端口
- => 奇了怪了, 一个xxx.sh脚本使用这个奇葩Port干啥(大于60000的Port, 有兴趣的砖友可以想下为什么Agent默认使用6W+的端口)
- => review 该脚本并没有进行端口监听的代码
- 定位问题出现在一个叫做xxxxxx.sh的脚本, 该脚本占用了Agent使用的端口
- 一拍脑袋, c.进程共享了父进程资源 了
- => 溯源该脚本,发现确实是Agent启动的任务中的脚本之一
- => 问题基本定位, 该脚本属于Agent调用的脚本
- =>