最近用 flask 写了一个简单的服务,大体是这样的:
这里姑且称这个服务为 A,服务 A 启动后,监听端口 A,端口 A 在收到请求后,会调用一个脚本启动服务器上的应用 B,应用 B 会监听端口 B。
然后,当服务 A 的进程终止后,再次启动服务 A,发现端口 A 被占用了,而占用 A 的是应用 B 的进程,而且此时想端口 A 发送正常调用业务 B 的请求也不会得到相应,必须将应用 B 杀死后才能启动服务 A。
请问,造成这样的原因是什么。
P.S,调用这一服务的脚本是通过 os.system 执行的。
1
messyidea 2017-07-07 21:39:42 +08:00
这应该不是 Flask 的问题了
话说服务 B 不是监听端口 B 吗? 为什么 "占用端口 A 的是应用 B 的进程"? 是不是 A 没有 SO_REUSEADDR 造成的? |
2
Kilerd 2017-07-07 21:45:47 +08:00
Flask: 这个锅我不想背。
|
3
realityone 2017-07-07 22:05:22 +08:00 via iPhone
启动 B 的时候不要继承 A 的 fd
|
4
billlee 2017-07-07 22:16:02 +08:00
用 subprocess.Popen, 指定 close_fds=True
|
5
Lax 2017-07-07 23:07:54 +08:00
A 用的哪个端口号,看看在不在 ip_local_port_range 范围内。
sysctl net.ipv4.ip_local_port_range B 应该还有向外的网络连接,可能用到上述的端口段,如果 A 端口在这个范围内就可能用到。 |
6
lolizeppelin 2017-07-12 18:26:06 +08:00 via Android
close fds 正解
或者 fork 后手动关闭 socket 的 fd 或者 fnctl 对端口 fd 设置标记 这些都是 python 以外的只是 算 Linux 程序开发的基本知识 |