Comment vérifier sous Linux avec Python si un processus est toujours en cours d’exécution ?[dupliquer]
Question
Cette question a déjà une réponse ici :
Le seul bon la façon dont j'ai trouvé est la suivante :
import sys
import os
try:
os.kill(int(sys.argv[1]), 0)
print "Running"
except:
print "Not running"
(Source)
Mais est-ce fiable ?Cela fonctionne-t-il avec chaque processus et chaque distribution ?
La solution
La réponse de Mark est la voie à suivre, après tout, c'est pourquoi le système de fichiers /proc est là.Pour quelque chose d'un peu plus copier/coller :
>>> import os.path
>>> os.path.exists("/proc/0")
False
>>> os.path.exists("/proc/12")
True
Autres conseils
sous Linux, vous pouvez consulter le répertoire /proc/$PID pour obtenir des informations sur ce processus.En fait, si le répertoire existe, le processus est en cours d'exécution.
Il devrait fonctionner sur n'importe quel système POSIX (même si en regardant le /proc
le système de fichiers, comme d'autres l'ont suggéré, est plus facile si vous savez qu'il sera là).
Cependant: os.kill
peut également échouer si vous n'êtes pas autorisé à signaler le processus.Vous devrez faire quelque chose comme :
import sys
import os
import errno
try:
os.kill(int(sys.argv[1]), 0)
except OSError, err:
if err.errno == errno.ESRCH:
print "Not running"
elif err.errno == errno.EPERM:
print "No permission to signal this process!"
else:
print "Unknown error"
else:
print "Running"
Voici la solution qui a résolu le problème pour moi :
import os
import subprocess
import re
def findThisProcess( process_name ):
ps = subprocess.Popen("ps -eaf | grep "+process_name, shell=True, stdout=subprocess.PIPE)
output = ps.stdout.read()
ps.stdout.close()
ps.wait()
return output
# This is the function you can use
def isThisRunning( process_name ):
output = findThisProcess( process_name )
if re.search('path/of/process'+process_name, output) is None:
return False
else:
return True
# Example of how to use
if isThisRunning('some_process') == False:
print("Not running")
else:
print("Running!")
Je suis un débutant Python + Linux, donc ce n'est peut-être pas optimal.Cela a résolu mon problème et j'espère qu'il aidera également d'autres personnes.
// Mais est-ce fiable ?Cela fonctionne-t-il avec chaque processus et chaque distribution ?
Oui, cela devrait fonctionner sur n'importe quelle distribution Linux.Sachez que /proc n'est cependant pas facilement disponible sur les systèmes basés sur Unix (FreeBSD, OSX).
Il me semble qu'une solution basée sur PID est trop vulnérable.Si le processus dont vous essayez de vérifier l'état a été terminé, son PID peut être réutilisé par un nouveau processus.Ainsi, IMO ShaChris23, le débutant Python + Linux, a donné la meilleure solution au problème.Même cela ne fonctionne que si le processus en question est identifiable de manière unique par sa chaîne de commande, ou si vous êtes sûr qu'il n'y en aura qu'un seul en cours d'exécution à la fois.
J'utilise ceci pour obtenir les processus et le nombre de processus du nom spécifié
import os
processname = 'somprocessname'
tmp = os.popen("ps -Af").read()
proccount = tmp.count(processname)
if proccount > 0:
print(proccount, ' processes running of ', processname, 'type')
J'ai eu des problèmes avec les versions ci-dessus (par exemple, la fonction a également trouvé une partie de la chaîne et de telles choses ...) J'ai donc écrit ma propre version modifiée de Maksym Kozlenko:
#proc -> name/id of the process
#id = 1 -> search for pid
#id = 0 -> search for name (default)
def process_exists(proc, id = 0):
ps = subprocess.Popen("ps -A", shell=True, stdout=subprocess.PIPE)
ps_pid = ps.pid
output = ps.stdout.read()
ps.stdout.close()
ps.wait()
for line in output.split("\n"):
if line != "" and line != None:
fields = line.split()
pid = fields[0]
pname = fields[3]
if(id == 0):
if(pname == proc):
return True
else:
if(pid == proc):
return True
return False
Je pense que c'est plus fiable, plus facile à lire et que vous avez la possibilité de vérifier les identifiants ou les noms de processus.
Version légèrement modifiée du script ShaChris23.Vérifie si la valeur proc_name est trouvée dans la chaîne d'arguments du processus (par exemple, un script Python exécuté avec python ) :
def process_exists(proc_name):
ps = subprocess.Popen("ps ax -o pid= -o args= ", shell=True, stdout=subprocess.PIPE)
ps_pid = ps.pid
output = ps.stdout.read()
ps.stdout.close()
ps.wait()
for line in output.split("\n"):
res = re.findall("(\d+) (.*)", line)
if res:
pid = int(res[0][0])
if proc_name in res[0][1] and pid != os.getpid() and pid != ps_pid:
return True
return False