python: как закрыть сокет потерянного домена из нового процесса

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


person THX    schedule 19.04.2016    source источник


Ответы (1)


Это была ошибка с моей стороны. Я вручную отправил процесс в режим сна на другой вкладке и не осознал этого, несмотря на то, что lsof показывает PID. После завершения процесса ядро ​​закрыло сокет, как и предполагалось. Так что все работает как положено.

person THX    schedule 19.04.2016