PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Python: single instance


mekakic
2013-01-03, 14:33:36
tach, kann mich jemand weiterhelfen, wie ich ein Python Programm dazu bringe zu ermitteln, ob es die einzige Instanz dieses Programms ist?

Einfach gesagt...

wenn es die erste Instanz ist, soll es einen background Task forken und sich beenden bzw. im Hintergrund arbeiten.
wenn der Background Task des Programms schon läuft; es also nicht die einzige Instanz ist, soll es dem Background Task eine Nachricht schicken und sich beenden

Vor allem steht irgendwie der Test rauszufinden, ob man (plattformunabhängig) die einzige Instanz ist. Weiß jemand wie das geht?

danke!!

nalye
2013-01-03, 14:44:58
Habe mal einen Codeschnipsel gefunden, kannst den ja mal ausbauen

pid = os.fork()
if (pid == 0): # The first child.
os.chdir("/")
os.setsid()
os.umask(0)
pid2 = os.fork()
if (pid2 == 0): # Second child
# YOUR CODE HERE
else:
sys.exit() #First child exists
else: # Parent Code
sys.exit() # Parent exists

//Edit: Wie sieht es mit einem Daemon aus? http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/
Wäre irgendwie auch sinnvoller

mekakic
2013-01-03, 14:54:16
Danke! Ich hab zwar gesagt, dass er forken soll... os.fork() steht aber unter windows nicht zur Verfügung. Ich hatte mir schon vorgenommen den Vorgang anders zu lösen... beim instance-test würde man dann ja so wieder reinlaufen.

nalye
2013-01-03, 14:58:22
os.fork() gibts nicht unter Windows? Uha... Wieder was gelernt!

Dr.Doom
2013-01-08, 16:10:52
Reservier einfach einen Socket, wenn du den dann nochmal reservieren willst, macht's bumm und du weisst, dass da schonmal jemand war. :freak:

Drexel
2013-01-08, 16:20:49
Reservier einfach einen Socket, wenn du den dann nochmal reservieren willst, macht's bumm und du weisst, dass da schonmal jemand war. :freak:

Sehr sicher methode, dieser jemand kann auch ein anderes Program gewesen sein. :tongue:

mekakic
2013-01-08, 16:35:44
Danke! Hab ich jetzt auch schon so gelöst gehabt und funktioniert ausreichend...

Da ich sowieso mit dem Background Task kommuniziere muß, soll das Programm den Task hinter dem belegten Socket noch verifizieren in dem sie sich entsprechend absprechen. Wenn jemand anders auf dem Port hängt, würde das Programm eben eine Fehlermeldung rausknallen... so hab ich mir das zumindest überlegt aber noch nicht wirklich implementiert.

Dr.Doom
2013-01-08, 19:05:31
Sehr sicher methode, dieser jemand kann auch ein anderes Program gewesen sein. :tongue:"quick and dirty" :up:

Marscel
2013-01-08, 20:31:05
"quick and dirty" :up:

Wenn sie nicht gerade noch miteinander reden müssten, hätte man auch einfach eine Lock-Datei durch den ersten Prozess anlegen können, die dann am Ende wieder gelöscht wird.

Ansonsten ist das OS-unabhängig total in Ordnung, gerade in Hinsicht auf Windows.

mekakic
2013-01-09, 09:51:34
Eine Lock Datei hab ich gerade letztens in einem Script verwendet... da darf man nach einem Absturz immer so schön aufräumen. Besser wäre es wenn das OS für einen tut.

Ich hatte versucht im Zusammenhang mit Python mal was zu NamedMutex' zu finden was ich schonmal unter C# in dem Zusammenhang verwendet habe aber nicht viel gefunden.