Flask 使用过程中的一个问题
最近用 flask 写了一个简单的服务,大体是这样的:
这里姑且称这个服务为 A,服务 A 启动后,监听端口 A,端口 A 在收到请求后,会调用一个脚本启动服务器上的应用 B,应用 B 会监听端口 B。
然后,当服务 A 的进程终止后,再次启动服务 A,发现端口 A 被占用了,而占用 A 的是应用 B 的进程,而且此时想端口 A 发送正常调用业务 B 的请求也不会得到相应,必须将应用 B 杀死后才能启动服务 A。
请问,造成这样的原因是什么。
P.S,调用这一服务的脚本是通过 os.system 执行的。
----------------------- 以下是精选回复-----------------------
答:这应该不是 Flask 的问题了
话说服务 B 不是监听端口 B 吗? 为什么 "占用端口 A 的是应用 B 的进程"?
是不是 A 没有 SO_REUSEADDR 造成的?
答:Flask: 这个锅我不想背。
答:启动 B 的时候不要继承 A 的 fd
答:用 subprocess.Popen, 指定 close_fds=True
答:A 用的哪个端口号,看看在不在 ip_local_port_range 范围内。
sysctl net.ipv4.ip_local_port_range
B 应该还有向外的网络连接,可能用到上述的端口段,如果 A 端口在这个范围内就可能用到。
答:close fds 正解
或者 fork 后手动关闭 socket 的 fd
或者 fnctl 对端口 fd 设置标记
这些都是 python 以外的只是
算 Linux 程序开发的基本知识
0条评论