feststellen ob ein prozess läuft

classic Classic list List threaded Threaded
16 messages Options
Reply | Threaded
Open this post in threaded view
|

feststellen ob ein prozess läuft

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?

danke für hinweise

gruss & frohe festtage
robert

_______________________________________________
python-de maillist  -  [hidden email]
http://python.net/mailman/listinfo/python-de

robert.vcf (222 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: feststellen ob ein prozess läuft

Andreas Jung


--On 20. Dezember 2007 09:01:50 +0100 robert rottermann <[hidden email]>
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?
>
Unter Linux kann man das Proc Filesystem auswerten (es gibt ein
pyprocps Modul)..

-aj
_______________________________________________
python-de maillist  -  [hidden email]
http://python.net/mailman/listinfo/python-de

attachment0 (193 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: feststellen ob ein prozess läuft

Sebastian Wiesner
In reply to this post by robert rottermann
[ robert rottermann <[hidden email]> ]
> 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)

_______________________________________________
python-de maillist  -  [hidden email]
http://python.net/mailman/listinfo/python-de

signature.asc (196 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: feststellen ob ein prozess läuft

Andreas Jung


--On 21. Dezember 2007 10:46:25 +0100 Sebastian Wiesner
<[hidden email]> wrote:

> [ robert rottermann <[hidden email]> ]
>> 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
_______________________________________________
python-de maillist  -  [hidden email]
http://python.net/mailman/listinfo/python-de

attachment0 (193 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: feststellen ob ein prozess läuft

Walter Dörwald
In reply to this post by robert rottermann
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


_______________________________________________
python-de maillist  -  [hidden email]
http://python.net/mailman/listinfo/python-de
Reply | Threaded
Open this post in threaded view
|

Re: feststellen ob ein prozess läuft

Sebastian Wiesner
In reply to this post by Andreas Jung
[ Andreas Jung <[hidden email]> ]

> --On 21. Dezember 2007 10:46:25 +0100 Sebastian Wiesner
>
> <[hidden email]> wrote:
> > [ robert rottermann <[hidden email]> ]
> >
> >> 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)

_______________________________________________
python-de maillist  -  [hidden email]
http://python.net/mailman/listinfo/python-de

signature.asc (196 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: feststellen ob ein prozess läuft

Ulrich Berning-2
In reply to this post by robert rottermann
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




_______________________________________________
python-de maillist  -  [hidden email]
http://python.net/mailman/listinfo/python-de
Reply | Threaded
Open this post in threaded view
|

Re: feststellen ob ein prozess läuft

robert rottermann
In reply to this post by robert rottermann
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  -  [hidden email]
> http://python.net/mailman/listinfo/python-de

_______________________________________________
python-de maillist  -  [hidden email]
http://python.net/mailman/listinfo/python-de

robert.vcf (188 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: feststellen ob ein prozess läuft

Andreas Jung
In reply to this post by Ulrich Berning-2


--On 21. Dezember 2007 12:30:03 +0100 Ulrich Berning
<[hidden email]> 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
_______________________________________________
python-de maillist  -  [hidden email]
http://python.net/mailman/listinfo/python-de

attachment0 (193 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: feststellen ob ein prozess läuft

Ulrich Berning-2
Andreas Jung wrote:

>
>
> --On 21. Dezember 2007 12:30:03 +0100 Ulrich Berning
> <[hidden email]> 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






_______________________________________________
python-de maillist  -  [hidden email]
http://python.net/mailman/listinfo/python-de
Reply | Threaded
Open this post in threaded view
|

Re: feststellen ob ein prozess läuft

robert rottermann
Ulrich Berning schrieb:

> Andreas Jung wrote:
>
>>
>> --On 21. Dezember 2007 12:30:03 +0100 Ulrich Berning
>> <[hidden email]> 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  -  [hidden email]
http://python.net/mailman/listinfo/python-de

robert.vcf (222 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: feststellen ob ein prozess läuft

Janko Hauser
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
>>> <[hidden email]> 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
>
>
> <robert.vcf>_______________________________________________
> python-de maillist  -  [hidden email]
> http://python.net/mailman/listinfo/python-de



--
Janko Hauser  email:  [hidden email]
               mobile: +49 1721 641552



_______________________________________________
python-de maillist  -  [hidden email]
http://python.net/mailman/listinfo/python-de
syk
Reply | Threaded
Open this post in threaded view
|

Re: feststellen ob ein prozess läuft

syk
In reply to this post by robert rottermann
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  -  [hidden email]
> http://python.net/mailman/listinfo/python-de
>  


_______________________________________________
python-de maillist  -  [hidden email]
http://python.net/mailman/listinfo/python-de
Reply | Threaded
Open this post in threaded view
|

Re: feststellen ob ein prozess läuft

robert rottermann
In reply to this post by Janko Hauser
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

_______________________________________________
python-de maillist  -  [hidden email]
http://python.net/mailman/listinfo/python-de

robert.vcf (222 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: feststellen ob ein prozess läuft

Christopher Arndt
In reply to this post by robert rottermann
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

_______________________________________________
python-de maillist  -  [hidden email]
http://python.net/mailman/listinfo/python-de
Reply | Threaded
Open this post in threaded view
|

Re: feststellen ob ein prozess läuft

Andreas Jung


--On 28. Dezember 2007 13:32:03 +0100 Christopher Arndt
<[hidden email]> wrote:

> 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/

Außerdem gibts aus der Zope Welt schon seit Ewigkeiten das "zdaemon" Modul.

<http://pypi.python.org/pypi/zdaemon/2.0.1>

Andreas
_______________________________________________
python-de maillist  -  [hidden email]
http://python.net/mailman/listinfo/python-de

attachment0 (193 bytes) Download Attachment