我有一个软件监视器(用于重启死进程),它运行一个Web服务器,用于向集中式应用程序管理器提供状态信息。如果由于子进程继承套接字详细信息而需要重新启动监视器,则存在重用webserver侦听套接字的问题。任何人都可以建议一个优雅的解决方案吗?理想情况下,人们希望监视器重启过程具有“干净”的环境!
下面的列表说明了问题:
[root@aws-dev01 listen]# cat listener.py
import socket, os
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
serversocket.bind(('', 9999))
serversocket.listen(5)
os.system('sleep 12345 &')
os.system('sleep 54321 &')
while True:
(clientsocket, address) = serversocket.accept()
print address
finally:
serversocket.close()
[root@aws-dev01 listen]# python listener.py &
[1] 7795
[root@aws-dev01 listen]# kill 7795
[root@aws-dev01 listen]# netstat -anp | grep 9999
tcp 0 0 0.0.0.0:9999 0.0.0.0:* LISTEN 7797/sleep
[1]+ Terminated python listener.py
[root@aws-dev01 listen]# kill 7797
[root@aws-dev01 listen]# netstat -anp | grep 9999
tcp 0 0 0.0.0.0:9999 0.0.0.0:* LISTEN 7799/sleep
[root@aws-dev01 listen]# kill 7799
[root@aws-dev01 listen]# netstat -anp | grep 9999
[root@aws-dev01 listen]#
由于 科林
答案 0 :(得分:0)
你想要的是,一旦exec()返回,serversocket就会在子进程中自动关闭。幸运的是,有一个调用可以完全启用该行为...只需在示例代码中的socket()之后添加以下行:
flags = fcntl.fcntl(serversocket, fcntl.F_GETFD)
fcntl.fcntl(serversocket, fcntl.F_SETFD, flags | fcntl.FD_CLOEXEC)
(请注意,这是一个POSIX-y的东西,所以如果它在Windows下运行我会非常惊讶)
参考:Python问题12107