Hallo, ich möchte feststellen, ob ein prozess noch läuft, von dem id die pzess-id kenne. z.Z. mache ich das so, dass ich mir mit ps alle prozesse ausgeben lasse, und dann scanne. gibt es da eine einfachere bzw bessere methode? danke für hinweise gruss & frohe festtage robert
--On 20. Dezember 2007 09:01:50 +0100 robert rottermann
Hallo,
ich möchte feststellen, ob ein prozess noch läuft, von dem id die pzess-id kenne.
z.Z. mache ich das so, dass ich mir mit ps alle prozesse ausgeben lasse, und dann scanne.
gibt es da eine einfachere bzw bessere methode?
Unter Linux kann man das Proc Filesystem auswerten (es gibt ein pyprocps Modul).. -aj
[ robert rottermann
Hallo,
ich möchte feststellen, ob ein prozess noch läuft, von dem id die pzess-id kenne.
z.Z. mache ich das so, dass ich mir mit ps alle prozesse ausgeben lasse, und dann scanne.
gibt es da eine einfachere bzw bessere methode?
running = str(pid) in os.listdir('/proc') oder running = pid in [fso for fso in os.listdir('/proc') if fso.isdigit()] Letzteres vergleicht wirklich nur die Prozessverzeichnisse in /proc. Ersteres sollte aber eigentlich ausreichen. -- Freiheit ist immer die Freiheit der Andersdenkenden. (Rosa Luxemburg)
--On 21. Dezember 2007 10:46:25 +0100 Sebastian Wiesner
[ robert rottermann
] Hallo,
ich möchte feststellen, ob ein prozess noch läuft, von dem id die pzess-id kenne.
z.Z. mache ich das so, dass ich mir mit ps alle prozesse ausgeben lasse, und dann scanne.
gibt es da eine einfachere bzw bessere methode?
running = str(pid) in os.listdir('/proc')
oder
running = pid in [fso for fso in os.listdir('/proc') if fso.isdigit()]
Beide Lösung sind unbrauchbar. os.listdir() hat zuviel Overhead bei vielen Prozessen. Es gibt os.path.exists(). Ausser kann es sein, dass ein anderer Prozess mittlerweile die gleiche PID hat wie der Prozess, den man überprüfen will (alles schon passiert im realen Betrieb). Deswegen muss man zusätzliche Infos aus dem ProcFS auswerten. -a
[ Andreas Jung
--On 21. Dezember 2007 10:46:25 +0100 Sebastian Wiesner
wrote: [ robert rottermann
] Hallo,
ich möchte feststellen, ob ein prozess noch läuft, von dem id die pzess-id kenne.
z.Z. mache ich das so, dass ich mir mit ps alle prozesse ausgeben lasse, und dann scanne.
gibt es da eine einfachere bzw bessere methode?
running = str(pid) in os.listdir('/proc')
oder
running = pid in [fso for fso in os.listdir('/proc') if fso.isdigit()]
Beide Lösung sind unbrauchbar. os.listdir() hat zuviel Overhead bei vielen Prozessen. Es gibt os.path.exists(). Stimmt, mein Fehler.
Ausser kann es sein, dass ein anderer Prozess mittlerweile die gleiche PID hat wie der Prozess, den man überprüfen will (alles schon passiert im realen Betrieb). Deswegen muss man zusätzliche Infos aus dem ProcFS auswerten. Aussage des OP: ich möchte feststellen, ob ein prozess noch läuft, von dem id die prozess-id kenne.
Ich habe das so verstanden, dass er nichts anderes über den Prozess weiß. In diesem Fall helfen ihm zusätzliche Infos aus /proc auch nicht weiter. Die mögliche Neubelegung einer bereits benutzten PID kann er so gar nicht erkennen. -- Freiheit ist immer die Freiheit der Andersdenkenden. (Rosa Luxemburg)
robert rottermann wrote:
Hallo,
ich möchte feststellen, ob ein prozess noch läuft, von dem id die pzess-id kenne.
z.Z. mache ich das so, dass ich mir mit ps alle prozesse ausgeben lasse, und dann scanne.
gibt es da eine einfachere bzw bessere methode?
os.kill(pid, 0) und testen, ob ein ESRCH-Fehler kommt, oder nicht. Servus, Walter
robert rottermann wrote:
Hallo,
ich möchte feststellen, ob ein prozess noch läuft, von dem id die pzess-id kenne.
z.Z. mache ich das so, dass ich mir mit ps alle prozesse ausgeben lasse, und dann scanne.
gibt es da eine einfachere bzw bessere methode?
danke für hinweise
Wie wär's hiermit: ------------ import os, signal, errno def processIsAlive(pid): try: os.kill(pid, signal.SIG_DFL) # Check existence of pid except os.error, args: if args.errno == errno.ESRCH: # No such process return False raise # Any other error return True if __name__ == '__main__': print processIsAlive(os.getpid()) print processIsAlive(22222222) ------------ Geht natürlich nur auf Linux/UNIX, ist aber der offizielle Weg (siehe Manual Page von kill()). Ulli
--On 21. Dezember 2007 12:30:03 +0100 Ulrich Berning
robert rottermann wrote:
Hallo,
ich möchte feststellen, ob ein prozess noch läuft, von dem id die pzess-id kenne.
z.Z. mache ich das so, dass ich mir mit ps alle prozesse ausgeben lasse, und dann scanne.
gibt es da eine einfachere bzw bessere methode?
danke für hinweise
Wie wär's hiermit:
------------ import os, signal, errno
def processIsAlive(pid): try: os.kill(pid, signal.SIG_DFL) # Check existence of pid except os.error, args: if args.errno == errno.ESRCH: # No such process return False raise # Any other error return True
if __name__ == '__main__': print processIsAlive(os.getpid()) print processIsAlive(22222222)
Damit überprüfst Du, ob der Prozess noch lebt aber Du kannst damit nicht testen, ob der Prozesse eigentlich noch der richtige ist, den Du eigentlich testen möchtest...Da ist selbst die Methode über ps -auxw|grep ....sicherer als das bisher genannte. -aj
Andreas Jung wrote:
--On 21. Dezember 2007 12:30:03 +0100 Ulrich Berning
wrote: robert rottermann wrote:
Hallo,
ich möchte feststellen, ob ein prozess noch läuft, von dem id die pzess-id kenne.
z.Z. mache ich das so, dass ich mir mit ps alle prozesse ausgeben lasse, und dann scanne.
gibt es da eine einfachere bzw bessere methode?
danke für hinweise
Wie wär's hiermit:
------------ import os, signal, errno
def processIsAlive(pid): try: os.kill(pid, signal.SIG_DFL) # Check existence of pid except os.error, args: if args.errno == errno.ESRCH: # No such process return False raise # Any other error return True
if __name__ == '__main__': print processIsAlive(os.getpid()) print processIsAlive(22222222)
Damit überprüfst Du, ob der Prozess noch lebt aber Du kannst damit nicht testen, ob der Prozesse eigentlich noch der richtige ist, den Du eigentlich testen möchtest...Da ist selbst die Methode über ps -auxw|grep ....sicherer als das bisher genannte.
- aj
Wenn wir es schon so genau nehmen, dann gibt ps -auxw| grep .... auch nicht mit Sicherheit den Prozess zurück, nach dem ich suche, denn die Prozess-ID könnte ja für einen Prozess neu vergeben sein, bei dem grep das gleiche Ergebnis liefert. Außerdem kann sich die Aufrufsyntax von ps von Release zu Release ändern. Portabel ist es sowieso nicht, es würde nur unter Linux laufen. Aber entgegen der scheinbar weit verbreiteten Ansicht gibt es durchaus noch Systeme wie AIX, IRIX, Solaris, HP-UX, BSD, etc., die müssen dann leider draußen bleiben. Da die Prozess-ID ja bekannt ist, gehe ich davon aus, daß das aufrufende Programm den Prozess selbst gestartet hat. Also wenn wir absolute Gewißheit brauchen, dann eben mit fork(), exec(), wait() oder waitpid(). Frohe Weihnachten Ulli
Ulrich Berning schrieb:
Andreas Jung wrote:
--On 21. Dezember 2007 12:30:03 +0100 Ulrich Berning
wrote: robert rottermann wrote:
Hallo,
ich möchte feststellen, ob ein prozess noch läuft, von dem id die pzess-id kenne.
z.Z. mache ich das so, dass ich mir mit ps alle prozesse ausgeben lasse, und dann scanne.
gibt es da eine einfachere bzw bessere methode?
danke für hinweise
Wie wär's hiermit:
------------ import os, signal, errno
def processIsAlive(pid): try: os.kill(pid, signal.SIG_DFL) # Check existence of pid except os.error, args: if args.errno == errno.ESRCH: # No such process return False raise # Any other error return True
if __name__ == '__main__': print processIsAlive(os.getpid()) print processIsAlive(22222222)
Damit überprüfst Du, ob der Prozess noch lebt aber Du kannst damit nicht testen, ob der Prozesse eigentlich noch der richtige ist, den Du eigentlich testen möchtest...Da ist selbst die Methode über ps -auxw|grep ....sicherer als das bisher genannte.
- aj
Wenn wir es schon so genau nehmen, dann gibt ps -auxw| grep .... auch nicht mit Sicherheit den Prozess zurück, nach dem ich suche, denn die Prozess-ID könnte ja für einen Prozess neu vergeben sein, bei dem grep das gleiche Ergebnis liefert. Außerdem kann sich die Aufrufsyntax von ps von Release zu Release ändern. Portabel ist es sowieso nicht, es würde nur unter Linux laufen. Aber entgegen der scheinbar weit verbreiteten Ansicht gibt es durchaus noch Systeme wie AIX, IRIX, Solaris, HP-UX, BSD, etc., die müssen dann leider draußen bleiben.
Da die Prozess-ID ja bekannt ist, gehe ich davon aus, daß das aufrufende Programm den Prozess selbst gestartet hat. Also wenn wir absolute Gewißheit brauchen, dann eben mit fork(), exec(), wait() oder waitpid().
Frohe Weihnachten Ulli
also, die diskussion ist sehr interessant, was ich mache, ist eine einige (potentiell 2-3 duzend) prozesse starten die als dämonen laufen. die pid wird jeweils in eine datei geschrieben. die prozesse werden je nach bedarf gestoppt und wieder neu gestartet, was ich brauche ist eine tabelarische übersicht welche prozesse laufen, parameter wie sie gestartet wurden usw. ich denke alle hier erwähnten ansätze sind bestens geeignet, festzustellen ob der prozess noch lebt. "fehlalarme" sind unkritisch. wie gesagt, ich machte das seit langem durch scannen des outputs von ps, aber das schien mir sehr "unelegant". danke robert
Ich denke das richtige Modul dafür wäre http://www.psychofx.com/psi/trac/wiki/ Gruß und ein frohes Weihnachtsfest, __Janko Am 21.12.2007 um 18:48 schrieb robert rottermann:
Ulrich Berning schrieb:
Andreas Jung wrote:
--On 21. Dezember 2007 12:30:03 +0100 Ulrich Berning
wrote: robert rottermann wrote:
Hallo,
ich möchte feststellen, ob ein prozess noch läuft, von dem id die pzess-id kenne.
z.Z. mache ich das so, dass ich mir mit ps alle prozesse ausgeben lasse, und dann scanne.
gibt es da eine einfachere bzw bessere methode?
danke für hinweise
Wie wär's hiermit:
------------ import os, signal, errno
def processIsAlive(pid): try: os.kill(pid, signal.SIG_DFL) # Check existence of pid except os.error, args: if args.errno == errno.ESRCH: # No such process return False raise # Any other error return True
if __name__ == '__main__': print processIsAlive(os.getpid()) print processIsAlive(22222222)
Damit überprüfst Du, ob der Prozess noch lebt aber Du kannst damit nicht testen, ob der Prozesse eigentlich noch der richtige ist, den Du eigentlich testen möchtest...Da ist selbst die Methode über ps -auxw|grep ....sicherer als das bisher genannte.
- aj
Wenn wir es schon so genau nehmen, dann gibt ps -auxw| grep .... auch nicht mit Sicherheit den Prozess zurück, nach dem ich suche, denn die Prozess-ID könnte ja für einen Prozess neu vergeben sein, bei dem grep das gleiche Ergebnis liefert. Außerdem kann sich die Aufrufsyntax von ps von Release zu Release ändern. Portabel ist es sowieso nicht, es würde nur unter Linux laufen. Aber entgegen der scheinbar weit verbreiteten Ansicht gibt es durchaus noch Systeme wie AIX, IRIX, Solaris, HP-UX, BSD, etc., die müssen dann leider draußen bleiben.
Da die Prozess-ID ja bekannt ist, gehe ich davon aus, daß das aufrufende Programm den Prozess selbst gestartet hat. Also wenn wir absolute Gewißheit brauchen, dann eben mit fork(), exec(), wait() oder waitpid().
Frohe Weihnachten Ulli
also, die diskussion ist sehr interessant,
was ich mache, ist eine einige (potentiell 2-3 duzend) prozesse starten die als dämonen laufen. die pid wird jeweils in eine datei geschrieben. die prozesse werden je nach bedarf gestoppt und wieder neu gestartet, was ich brauche ist eine tabelarische übersicht welche prozesse laufen, parameter wie sie gestartet wurden usw.
ich denke alle hier erwähnten ansätze sind bestens geeignet, festzustellen ob der prozess noch lebt. "fehlalarme" sind unkritisch. wie gesagt, ich machte das seit langem durch scannen des outputs von ps, aber das schien mir sehr "unelegant".
danke robert
_______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
-- Janko Hauser email: jhauser@zscout.de mobile: +49 1721 641552
Janko Hauser schrieb:
Ich denke das richtige Modul dafür wäre
http://www.psychofx.com/psi/trac/wiki/ gefällt mir spitzenmassig
Gruß und ein frohes Weihnachtsfest,
Dir auch und allen freundinnen&freunden in python natürlich auch robert
robert rottermann schrieb:
was ich mache, ist eine einige (potentiell 2-3 duzend) prozesse starten die als dämonen laufen. die pid wird jeweils in eine datei geschrieben. die prozesse werden je nach bedarf gestoppt und wieder neu gestartet, was ich brauche ist eine tabelarische übersicht welche prozesse laufen, parameter wie sie gestartet wurden usw.
Das klingt ein wenig so, als gäbe es schon, was du brauchst: http://www.plope.com/software/supervisor2/ Chris
--On 28. Dezember 2007 13:32:03 +0100 Christopher Arndt
robert rottermann schrieb:
was ich mache, ist eine einige (potentiell 2-3 duzend) prozesse starten die als dämonen laufen. die pid wird jeweils in eine datei geschrieben. die prozesse werden je nach bedarf gestoppt und wieder neu gestartet, was ich brauche ist eine tabelarische übersicht welche prozesse laufen, parameter wie sie gestartet wurden usw.
Das klingt ein wenig so, als gäbe es schon, was du brauchst:
Außerdem gibts aus der Zope Welt schon seit Ewigkeiten das "zdaemon" Modul. http://pypi.python.org/pypi/zdaemon/2.0.1 Andreas
danke für die antworten frohe festtage robert robert rottermann schrieb:
Hallo,
ich möchte feststellen, ob ein prozess noch läuft, von dem id die pzess-id kenne.
z.Z. mache ich das so, dass ich mir mit ps alle prozesse ausgeben lasse, und dann scanne.
gibt es da eine einfachere bzw bessere methode?
danke für hinweise
gruss & frohe festtage robert
_______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
Hallo. Ich benutze das Modul pexpect. Damit starte ich mit den Prozess und kontrolliere sein Lebenszustand etwa so: ************************* import pexpect prozess = pexpect.spawn("ping www.python.org") if prozess.isalive(): # wenn am leben gibt es True aus print "Er lebt und ping auchnoch ohne Ende!" ************************ sonst kannst du einfach ************************ import pexpect prozess = "ping" pruefe = pexpect.run("ps ax | grep %s | grep -v grep "%prozess ) if pruefe not "": print "prozess scheint zu leben" *************************** das ganze geht natürlich auch mit dem os-modul wie os.popen2(cmd) ************************** schöne feiertage YK robert rottermann wrote:
Hallo,
ich möchte feststellen, ob ein prozess noch läuft, von dem id die pzess-id kenne.
z.Z. mache ich das so, dass ich mir mit ps alle prozesse ausgeben lasse, und dann scanne.
gibt es da eine einfachere bzw bessere methode?
danke für hinweise
gruss & frohe festtage robert
_______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
participants (8)
-
Andreas Jung
-
Christopher Arndt
-
Janko Hauser
-
robert rottermann
-
Sebastian Wiesner
-
syk
-
Ulrich Berning
-
Walter Dörwald