Python踩坑之旅其一杀不死的Shell子进程

博客讲述了在Python中遇到的一个问题,即一个Shell子进程在执行后无法被正确关闭,导致端口被占用。作者通过分析发现,子进程继承了父进程的资源,即使父进程被杀死,子进程仍然存活。解决方案涉及修改代码以确保子进程被正确终止,并讨论了进程资源继承和端口管理的相关知识。
摘要由CSDN通过智能技术生成

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 该脚本并没有进行端口监听的代码
  • 一拍脑袋, c.进程共享了父进程资源 了
    • => 溯源该脚本,发现确实是Agent启动的任务中的脚本之一
    • => 问题基本定位, 该脚本属于Agent调用的脚本
    • => 该Agent继承了Agent原来的资源FD, 也就是这个port
    • => 虽然该脚本由于超时被动触发了term
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值