分享

python主进程结束,子进程继承了主进程的端口怎么破

grinsky 发表于 2016-11-17 19:05:29 [显示全部楼层] 只看大图 回帖奖励 阅读模式 关闭右栏 2 11963
QQ图片20161117185746.png

如上图,PID是14732的python进程,PID是14776是python启动的flume进程。
这个时候各自监听一个端口,然后我kill掉了python的进程。
在启动这个python脚本时就报错了。如上图发现时原先python脚本监听的端口被flume监听了。
但我flume根本没配置监听那个端口,flume只是配置了监听一个44444端口,
貌似是python被kill后flume继承了python的端口?!

这个是个神秘问题吗?偶实在无法理解并去分析是哪里出问题了。
各位大大,能提供下思考方向么?我完全抓瞎了,不知道往哪里查。

已有(2)人评论

跳转到指定楼层
easthome001 发表于 2016-11-17 19:43:11
Linux有这个特点的
应该是子进程继承了父进程的文件描述符,所以虽然父进程关了,进程里面对应的文件描述符没关闭

系统认为对应的文件没有关闭(linux里面所有的东西都被看成文件,打开的socket说成文件没问题吧)

系统就认为端口还被占用

问题就出在子进程继承了父进程的文件描述符上




python启动子进程的方法主要有3种

os.system()这个函数和c中的os.system()类似,无法对子进程进行控制

os.popen()可以获取子进程的输出

subprocss.Popen()这个函数对子进程的控制选项比较多


[mw_shl_code=bash,true]subprocess.Popen(args, bufsize=0,
executable=None, stdin=None, stdout=None,
stderr=None, preexec_fn=None,
close_fds=False, shell=False,
cwd=None, env=None, universal_newlines=False,
startupinfo=None, creationflags=0)[/mw_shl_code]

close_fds=False,把值改为True,会关闭从父进程继承的文件描述符

需要注意的是args参数是个list,命令的参数是多个时不能直接给个字符串,需要转换成['args1','args2'......]这样的格式


楼主可以尝试上面方法



回复

使用道具 举报

grinsky 发表于 2016-11-18 10:19:20
easthome001 发表于 2016-11-17 19:43
Linux有这个特点的
应该是子进程继承了父进程的文件描述符,所以虽然父进程关了,进程里面对应的文件描述 ...

感谢!
按照您的方法修改成
psutil.Popen(cmd_full,shell=True,close_fds=True)
在kill python进程,子进程就没有在继承那个端口了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条