¿Cómo verifica en Linux con Python si un proceso todavía se está ejecutando?

La única manera agradable que he encontrado es:

import sys import os try: os.kill(int(sys.argv[1]), 0) print "Running" except: print "Not running" 

( Fuente )
¿Pero es esto confiable? ¿Funciona con cada proceso y cada distribución?

La respuesta de Mark es el camino a seguir, después de todo, es por eso que el sistema de archivos / proc está ahí. Para algo un poco más de copia / pasteable:

  >>> import os.path >>> os.path.exists("/proc/0") False >>> os.path.exists("/proc/12") True 

En Linux, puede buscar en el directorio / proc / $ PID para obtener información sobre ese proceso. De hecho, si el directorio existe, el proceso se está ejecutando.

Debería funcionar en cualquier sistema POSIX (aunque observar el sistema de archivos /proc , como han sugerido otros, es más fácil si sabes que estará allí).

Sin embargo: os.kill también puede fallar si no tiene permiso para señalar el proceso. Necesitarías hacer algo como:

 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" 

// ¿Pero es esto confiable? ¿Funciona con cada proceso y cada distribución?

Sí, debería funcionar en cualquier distribución de Linux. Tenga en cuenta que / proc no está fácilmente disponible en sistemas basados ​​en Unix, aunque (FreeBSD, OSX).

Aquí está la solución que me lo resolvió:

 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!") 

Soy un novato de Python + Linux, por lo que esto podría no ser óptimo. Resolvió mi problema, y ​​espero que también ayude a otras personas.

Me parece que una solución basada en PID es demasiado vulnerable. Si el proceso en el que está intentando verificar el estado ha finalizado, su PID puede reutilizarse mediante un nuevo proceso. Entonces, IMO ShaChris23, el novato de Python + Linux, dio la mejor solución al problema. Incluso solo funciona si el proceso en cuestión es identificable de forma única por su cadena de comando, o si está seguro de que solo se ejecutará uno a la vez.

Uso esto para obtener los procesos y el recuento del proceso del nombre especificado

 import os processname = 'somprocessname' tmp = os.popen("ps -Af").read() proccount = tmp.count(processname) if proccount > 0: print(proccount, ' processes running of ', processname, 'type') 

Tuve problemas con las versiones anteriores (por ejemplo, la función también fue parte de la cadena y cosas así …), así que escribí mi propia versión modificada 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 

Creo que es más confiable, más fácil de leer y tiene la opción de verificar los identificadores o nombres de los procesos.

Versión ligeramente modificada de la secuencia de comandos ShaChris23. Comprueba si el valor proc_name se encuentra dentro de la cadena args del proceso (por ejemplo, el script Python ejecutado con 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