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