Seite 1 von 1

Programm Starten, wenn es bereits Läuft, informieren

Verfasst: Donnerstag 8. Juni 2006, 20:57
von keppla
Hallo!

Ich möchte gerne, dass mein Programm nur einmal (pro Benutzer) gestartet wird, und dass wenn der Benutzer versucht, das Programm zu starten, während es läuft, die bereits laufende Instanz das bemerkt und die commandlineargs dieses Startversuchs erfährt.

gibt es dafür eine (möglichst systemunabhängige) Lösung innerhalb Pythons?

Verfasst: Donnerstag 8. Juni 2006, 21:03
von Rebecca
Mmh, das einfachste ist wahrscheinlich, wenn dein Programm beim Start eine bestimmte Datei anlegt und beim Beenden wieder loescht. Existiert diese Datei schon, weiss dein Programm, dass das gleiche Programm schon laeuft.

Verfasst: Donnerstag 8. Juni 2006, 22:00
von DatenMetzgerX
Und jetzt wird dein Programm unerwartet beendet, datei wird nicht gelöscht, und user nervt sich^^ evtl kannst du nach einem gewissen Prozess namen suchen...

Verfasst: Donnerstag 8. Juni 2006, 22:09
von keppla
vermutlich wäre es dann besser, nicht zu überprüfen, ob sie existiert, sondern sich einen lock zu holen,

das löst aber noch nicht das Problem, dass das bereits laufende Programm informiert werden soll, und es wäre nicht mehr OS-Unabhängig.

Verfasst: Donnerstag 8. Juni 2006, 23:27
von keppla
So wie es aussieht, hab ich eine eine Lösung mit pyGTK gefunden:

http://www.pygtk.org/pygtk2tutorial/sec ... ckets.html

Verfasst: Freitag 9. Juni 2006, 09:10
von Rebecca
DatenMetzgerX hat geschrieben:Und jetzt wird dein Programm unerwartet beendet, datei wird nicht gelöscht, und user nervt sich^^.
Ja, ich erinnere mich an eine alte Netscapeversion unter Unix, die sich hin und wieder aufhing, und danach musste mann irgend eine lock-Datei per Hand loeschen... Aber eigentlich bringt Python bringt doch genug Moeglichkeiten mit, Programmabbrueche und Exceptions abzufangen:

Code: Alles auswählen

#!/usr/bin/env python

import atexit;
import time;
import signal;
import sys;

def on_exit():
    print "Received exit"

def on_signal(signum, frame):
    print "Received signal", signum
    sys.exit(0);

atexit.register(on_exit);
signal.signal(signal.SIGTERM, on_signal);

while True:
    print "Running..."
    time.sleep(1)
Ein SIGKILL auf Linuxen und Unixen laesst sich auf diese nicht abfangen, aber die sollten auch nur auftreten, wenn andere Methoden nicht gewirkt haben (oder der User kill -9 benutzt *pfeif*). Okay, jetzt muss man noch rausfinden, welche Signale auf welchen Systemen vorhanden (und behandelbar) sind, oder ganz viele try-except-Bloecke machen....
DatenMetzgerX hat geschrieben:evtl kannst du nach einem gewissen Prozess namen suchen...
...was aber auch wieder betriebssystemabhaengig ist. Ausserdem ist der Programmname bei mir (Linux) immer der Name des interpreters (also Python), man muss also schon die aufrufende Zeile haben. Ist unter Linux auch nicht das Problem (wenn das Proc-Verzeichnis existiert), aber eben auch nicht so ganz straight forward.

Verfasst: Freitag 9. Juni 2006, 09:45
von Mad-Marty
Bei diesen Thema könnt ihr OS Unabhängigkeit komplett vergessen.

Unter windows: Messagepump mit WM-Handler verwenden.
Unter *Nix: Signalhandler verwenden.


Unter Windows erfordert das ganze keine PID, da WM's von allen Prozessen zugreifbar sind.

Unter *Nix brauchst du allerdings die PID um ein Signal dahin zu senden.


Der laufende Prozess muss dann im jeweiligen Handler eine aktion definieren, z.b. sich selbst beenden.

Verfasst: Samstag 14. Oktober 2006, 10:34
von thonix
Ich habe noch eine Frage zu diesem Punkt...

wie bekomme ich es hin das es auch bei Threads funktioniert.

Das geht nämlich ned:

Code: Alles auswählen

#!/usr/bin/python  
 
import atexit; 
import time; 
import signal; 
import sys;
import os;
import threading;
 
def on_exit(): 
     print "Received exit" 
 
def on_signal(signum, frame): 
     print "Received signal", signum 
     sys.exit(0); 
 
atexit.register(on_exit); 
signal.signal(signal.SIGTERM, on_signal); 

class th1 ( threading.Thread ) :
	
	def __init__(self, name="CheckDisk") :
		"""
		Constructor, setting initial variables
		"""
		threading.Thread.__init__(self, name=name)
		
	def run(self):
		while True:
			print "Running..." + str(os.getpid())
			time.sleep(1)	
	



th = th1 ("call")
th.start()
was besonderes muss ich dabei beachten ?

Thonix

Verfasst: Samstag 14. Oktober 2006, 11:59
von Leonidas
thonix hat geschrieben:was besonderes muss ich dabei beachten ?
Wie wärs mit PEP8, den Python Stylequide?

Aber sonst ist dein Problem ziemlich interessant, das Programm konnte ich nur mit einem SIGKILL beenden. run() wird scheinbar nie verlassen.

Verfasst: Montag 16. Oktober 2006, 08:29
von Rebecca
Mmh, sobald in Zeile 19 ein Signal registriert ist, scheint dieses Signal ignoriert zu werden. Kommentiere ich die Zeile aus, kann ich dem Prozess auch wieder ein SIGTERM schicken.
Python-Doku hat geschrieben:Some care must be taken if both signals and threads are used in the same program. The fundamental thing to remember in using signals and threads simultaneously is: always perform signal() operations in the main thread of execution. Any thread can perform an alarm(), getsignal(), or pause(); only the main thread can set a new signal handler, and the main thread will be the only one to receive signals (this is enforced by the Python signal module, even if the underlying thread implementation supports sending signals to individual threads). This means that signals can't be used as a means of inter-thread communication. Use locks instead.

Aber nach meinem Verstaendnis hat thonix alles richtig gemacht.

Verfasst: Mittwoch 18. Oktober 2006, 21:32
von MoR4euZ
ohje was lese ich den hier :(

kann man mit python keine processe starten oder stopen?
braucht man zwingend eine sprache die mit exceptions umgehen kann?

ich würde gerne mal eine gamestatistik wie bei xfire (www.de.xfire.com) coden

wie könnte man sowas am besten umsetzten?
nicht mit python oder? :)

fragen über fragen sorry ;)

[EDIT]
jap sorry hast recht :)

http://www.python-forum.de/viewtopic.php?p=47003#47003
[/EDIT]

Verfasst: Mittwoch 18. Oktober 2006, 21:34
von murph
das geht hier um was ganz spezielles.
mach mal lieber einen neuen post, das passt besser...

Verfasst: Mittwoch 18. Oktober 2006, 22:15
von BlackJack
MoR4euZ hat geschrieben:ohje was lese ich den hier :(
Einen Beitrag im deutschen Python-Forum.
kann man mit python keine processe starten oder stopen?
Doch das kann man mit Python machen.
braucht man zwingend eine sprache die mit exceptions umgehen kann?
Braucht man nicht zwingend, macht aber einiges einfacher. Python kennt ja netterweise Ausnahmen, also kann man sie auch benutzen.
ich würde gerne mal eine gamestatistik wie bei xfire (www.de.xfire.com) coden

Code: Alles auswählen

An error occurred while loading http://www.de.xfire.com:
Unknown host www.de.xfire.com
wie könnte man sowas am besten umsetzten?
nicht mit python oder? :)
Was umsetzen? Eine nichtexistente Domain? Das geht in keiner Programmiersprache, das ist eine Frage von Domainregistrierung und Webserverkonfiguration. :twisted:

Verfasst: Mittwoch 18. Oktober 2006, 22:28
von MoR4euZ
oh habe einfach mal ein www davor gekanallt ;)
http://de.xfire.com/

danke für die antworten