2016-04-19 17 views
0

Ich plane, Domain-Sockets als Sperre zu verwenden, um nur eine aktive Instanz (Linux-Kernel> = 2.6) zu gewährleisten.Python: Wie verwaiste Domain-Socket von neuen Prozess

Also binde ich einen Domain-Socket an den aktiven Prozess und erstelle auch eine Sperrdatei mit der PID für eine humanfreundlichere Check-Option in der 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) 

Es ist im Allgemeinen arbeiten, aber jetzt habe ich es geschafft, ein Verfahren schwer zu töten, so dass es nicht seine Buchse an der Ausfahrt und die Steckdose in der Nähe ist offen über den Prozess Lebenszeit gehalten:

> 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) 

Da ich eine PID-Datei als Gegenprobe habe, möchte ich den Socket schließen (nach Überprüfung der Integrität im Prozessbaum als einziger). Ich kann jedoch nicht von einer neuen Instanz an den Socket binden, da es immer noch als Zombie-Socket gebunden ist.

Gibt es einen Python-Weg, um bestehende Unix-Domain-Sockets zu schließen (wenn nötig als pid 0 ausgeführt)?

Antwort

0

Es war ein Fehler auf meiner Seite. Ich hatte den Prozess manuell gesendet, um in einem anderen Tab zu schlafen, und ich habe es nicht bemerkt, obwohl ich die PID zeige. Nach dem Beenden des Prozesses schloss der Kernel den Socket wie beabsichtigt. So funktioniert alles wie erwartet.