我计划使用域套接字作为锁来确保只有一个活动实例(Linux内核> = 2.6)。
因此,我将域套接字绑定到活动进程,并创建一个带有PID的锁文件,以便在fs中提供更人性化的检查选项。
import socket
class processLock(object):
def __init__(self, processName):
self.processName = processName
self.PIDfile = os.path.join(self.getTMPDIR(),"UID-%s_PROCESS-%s.pid" % (os.getuid(), processName) )
...
self.socket.bind('\0' + self.processName)
...
atexit.register(self.cleanup)
...
def cleanup(self):
self.socket.shutdown(socket.SHUT_RDWR)
self.socket.close()
self.socketOK = False
os.remove(self.PIDfile)
它通常可以正常工作,但是现在我设法杀死了一个进程,以便它不会在退出时关闭它的套接字并且套接字在进程之外保持打开状态'寿命:
> lsof
condorJob 124485 root 4u unix 0xffff88186c3341c0 0t0 175181414 @TestFooName
condorJob 124485 root 5w REG 8,6 0 13893673 /var/tmp/UID-0_PROCESS-TestFooName.pid (deleted)
由于我有一个PID文件作为交叉检查,我想关闭套接字(在进程树中的完整性检查之后是唯一的)。但是,我无法从新实例绑定到套接字,因为它仍然绑定为〜僵尸套接字。
是否有python方法可以关闭现有的unix域套接字(如有必要,可以作为pid 0运行)?
答案 0 :(得分:1)
这是我的错误。我已经手动将进程发送到另一个选项卡中睡眠,尽管lsof显示了PID,但我没有意识到它。在杀死进程后,内核按预期关闭了套接字。所以一切都按预期工作。