2010-12-29 9 views
5

Digamos que tengo un PID, como 555. Quiero ver si ese pid se está ejecutando o se ha completado. Puedo verificar/proc/pero no tengo acceso a eso en mi entorno de producción. ¿Cuál es la mejor manera de hacer esto, salvo algún hackish como abrir una tubería para "ps"?En Python, sin usar el sistema de archivos/proc, ¿cómo puedo saber si se está ejecutando un PID determinado?

+1

¿El comando Linux 'ps' en sí no usa/proc? – PleaseStand

+0

No. De hecho, muchos entornos no usan el sistema de archivos/proc. –

Respuesta

11

Utilice la función os.kill() con un número de señales de 0. Si el proceso pid existe, entonces la llamada tendrá éxito, de lo contrario generará un OSError excepción:

try: 
    os.kill(pid, 0) 
    print("process exists") 
except OSError: 
    print("process does not exist") 

La documentación para el kill(2) mi sistema dice:

el matan función() envía la señal dada por sig a pid, un proceso o un grupo de procesos. Sig puede ser una de las señales especificadas en sigaction (2) o puede ser 0, en cuyo caso se realiza la comprobación de errores pero no se envía ninguna señal. Esto se puede usar para verificar la validez de pid.

+0

Exactamente lo que estaba buscando. Terminé de matar por su nombre. Gracias. –

2

Usa os.kill() como lo mencionó Greg, pero ten en cuenta que la llamada al sistema kill no comprueba si el proceso existe, pero si puedes enviar un kill al proceso. Un modo de falla es si el proceso no existe, pero otro es que no tiene permiso para matarlo. Para diferenciar, usted tiene que comprobar la excepción:

try: 
    os.kill(pid, 0) 
    print 'Process exists and we can kill it' 
except OSError, e: 
    if e.errno == 1: 
     print 'Process exists, but we cannot kill it' 
    else: 
     raise 

Esto no es necesario si usted sabe que siempre va a tener permiso para matar el proceso que está mirando para, por ejemplo, ya se está ejecutando como root o el proceso se sabe que se ejecuta bajo el mismo UID que el proceso que lo verifica.

Cuestiones relacionadas