Я планирую использовать доменные сокеты в качестве блокировки, чтобы обеспечить только один активный экземпляр (ядро 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)?