Programm Starten, wenn es bereits Läuft, informieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Donnerstag 8. Juni 2006, 20:57

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?
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Donnerstag 8. Juni 2006, 21:03

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.
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Donnerstag 8. Juni 2006, 22:00

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...
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Donnerstag 8. Juni 2006, 22:09

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.
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Donnerstag 8. Juni 2006, 23:27

So wie es aussieht, hab ich eine eine Lösung mit pyGTK gefunden:

http://www.pygtk.org/pygtk2tutorial/sec ... ckets.html
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Freitag 9. Juni 2006, 09:10

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.
Mad-Marty
User
Beiträge: 317
Registriert: Mittwoch 18. Januar 2006, 19:46

Freitag 9. Juni 2006, 09:45

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.
thonix
User
Beiträge: 47
Registriert: Samstag 12. August 2006, 00:06

Samstag 14. Oktober 2006, 10:34

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
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Samstag 14. Oktober 2006, 11:59

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Montag 16. Oktober 2006, 08:29

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.
Benutzeravatar
MoR4euZ
User
Beiträge: 34
Registriert: Mittwoch 18. Oktober 2006, 21:21
Wohnort: Essen
Kontaktdaten:

Mittwoch 18. Oktober 2006, 21:32

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]
Zuletzt geändert von MoR4euZ am Mittwoch 18. Oktober 2006, 21:56, insgesamt 2-mal geändert.
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Mittwoch 18. Oktober 2006, 21:34

das geht hier um was ganz spezielles.
mach mal lieber einen neuen post, das passt besser...
http://www.cs.unm.edu/~dlchao/flake/doom/
BlackJack

Mittwoch 18. Oktober 2006, 22:15

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:
Benutzeravatar
MoR4euZ
User
Beiträge: 34
Registriert: Mittwoch 18. Oktober 2006, 21:21
Wohnort: Essen
Kontaktdaten:

Mittwoch 18. Oktober 2006, 22:28

oh habe einfach mal ein www davor gekanallt ;)
http://de.xfire.com/

danke für die antworten
Antworten