父终止后,后台子进程持有的服务器侦听套接字

时间:2014-03-13 01:28:02

标签: sockets

我有一个软件监视器(用于重启死进程),它运行一个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]#

由于 科林

1 个答案:

答案 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