2008-09-01 21 views

Respuesta

49

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

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

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.

11

Debería funcionar en cualquier sistema POSIX (aunque mirar el sistema de archivos /proc, como han sugerido otros, 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. Usted tendría que 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" 
6

// ¿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).

6

Aquí está la solución que resuelve para mí:

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 Python + Linux, por lo que este podría no ser óptima. Resolvió mi problema y espero que ayude a otras personas también.

+1

Esta voluntad fallan tanto cuando el proceso tiene múltiples hijos. –

5

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.

+1

Si está ejecutando algunas versiones de Linux, el número de PID únicos es 32768 o lo que sea que esté en/proc/sys/kernel/pid_max, lo que hace que un PID reutilizado sea poco probable para programas de ejecución corta. –

0

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

he tenido problemas con las versiones anteriores (por ejemplo, la función se encontró también forma parte de la cadena y esas cosas .. .) así que escribí mi propia versión modificada del Maksym Kozlenko de:

#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 fiable, fácil de leer y tiene la opción de buscar los identificadores de proceso o nombres.

4

Lo utilizo 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') 
Cuestiones relacionadas