Flask 使用过程中的一个问题

2017-07-07 21:06:58 +08:00
 nyaruko

最近用 flask 写了一个简单的服务,大体是这样的:

这里姑且称这个服务为 A,服务 A 启动后,监听端口 A,端口 A 在收到请求后,会调用一个脚本启动服务器上的应用 B,应用 B 会监听端口 B。

然后,当服务 A 的进程终止后,再次启动服务 A,发现端口 A 被占用了,而占用 A 的是应用 B 的进程,而且此时想端口 A 发送正常调用业务 B 的请求也不会得到相应,必须将应用 B 杀死后才能启动服务 A。

请问,造成这样的原因是什么。

P.S,调用这一服务的脚本是通过 os.system 执行的。

2678 次点击
所在节点    Python
6 条回复
messyidea
2017-07-07 21:39:42 +08:00
这应该不是 Flask 的问题了
话说服务 B 不是监听端口 B 吗? 为什么 "占用端口 A 的是应用 B 的进程"?
是不是 A 没有 SO_REUSEADDR 造成的?
Kilerd
2017-07-07 21:45:47 +08:00
Flask: 这个锅我不想背。
realityone
2017-07-07 22:05:22 +08:00
启动 B 的时候不要继承 A 的 fd
billlee
2017-07-07 22:16:02 +08:00
用 subprocess.Popen, 指定 close_fds=True
Lax
2017-07-07 23:07:54 +08:00
A 用的哪个端口号,看看在不在 ip_local_port_range 范围内。
sysctl net.ipv4.ip_local_port_range

B 应该还有向外的网络连接,可能用到上述的端口段,如果 A 端口在这个范围内就可能用到。
lolizeppelin
2017-07-12 18:26:06 +08:00
close fds 正解

或者 fork 后手动关闭 socket 的 fd

或者 fnctl 对端口 fd 设置标记


这些都是 python 以外的只是
算 Linux 程序开发的基本知识

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/373817

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX