[Python-de] feststellen ob ein prozess läuft

Ulrich Berning ulrich.berning at denviso.de
Fr Dez 21 14:12:01 UTC 2007


Andreas Jung wrote:

>
>
> --On 21. Dezember 2007 12:30:03 +0100 Ulrich Berning 
> <ulrich.berning at denviso.de> 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