tutorial script saber esta español ejecutando como python linux unix process

python - español - como saber si un script se esta ejecutando en linux



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

Esta pregunta ya tiene una respuesta aquí:

La única buena manera 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?


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

Sin embargo, os.kill también puede fallar si no tiene permiso para señalar el proceso. Deberí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"


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


// ¿Pero esto es 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á disponible fácilmente en sistemas basados ​​en Unix, sin embargo (FreeBSD, OSX).


Esta es la solución que me solucionó:

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 podría no ser óptimo. Resolvió mi problema y espero que ayude a otras personas también.


Me parece que una solución basada en PID es demasiado vulnerable. Si el proceso que está intentando verificar el estado de 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 exclusiva por su cadena de comandos, o si está seguro de que solo se ejecutará uno a la vez.


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


tuve problemas con las versiones anteriores (por ejemplo, la función que también se encuentra en la cadena y cosas por el estilo ...) 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 tienes la opción de verificar identificadores de proceso o nombres.


Lo uso 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'')