Я планирую использовать сокеты домена в качестве блокировки для обеспечения только одного активного экземпляра (ядро Linux> = 2.6).python: как закрыть осиротевший доменный сокет из нового процесса
Итак, я привязываю доменный сокет к активному процессу и создаю также файл блокировки с 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, если необходимо)?