踩坑的程序是个常驻的Agent类管理进程, 包括但不限于如下类型的任务在执行:
发现坑的过程很有意思:
netstat -tanop|grep port_number
发现端口确实有人占用通过代码review, 找到shell具体执行的库代码如下:
self._subpro = subprocess.Popen(
cmd, shell=True, stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
preexec_fn=_signal_handle
)
# 重点是shell=True !
把上述代码改为:
self._subpro = subprocess.Popen(
cmd.split(), stdout=subprocess.PIPE,
stderr=subprocess.PIPE, preexec_fn=_signal_handle
)
# 重点是去掉了shell=True
Agent会在一个新创建的threading线程中执行这段代码, 如果线程执行时间超时(xx seconds), 会调用 self._subpro.terminate()
终止该脚本.
表面正常:
深层问题:
这样虽然杀死了shell进程(未必死亡, 可能进入defunct状态), 但实际的执行进程确活着. 于是1.1
中的坑就被结实的踩上了.
本节扩展知识包括二个部分:
扩展知识留到下篇末尾讲述, 感兴趣的可以自行搜索
如果只kill某进程的父进程, 集成了父进程资源的子进程会继续占用父进程的资源不释放, 包括但不限于
Life is short. We use Python
工号: 程序员的梦呓指南
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。