2016-04-19 5 views
0

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

ответ

0

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

Смежные вопросы