Saltar al contenido

¿Hay alguna forma de comprobar si un subproceso todavía se está ejecutando?

Solución:

Pregunta: … una forma de comprobar si un proceso aún se está ejecutando …

Puedes hacerlo por ejemplo:

p = subprocess.Popen(...
"""
A None value indicates that the process hasn't terminated yet.
"""
poll = p.poll()
if poll is None:
  # p.subprocess is alive

Python »3.6.1 Documentación popen-objects

Probado con Python: 3.4.2

Haciendo el

myProcessIsRunning = poll() is None 

Como sugiere la respuesta principal, es la forma recomendada y la forma más sencilla de verificar si un proceso se está ejecutando. (y también funciona en jython)

Si no tiene la instancia de proceso a mano, verifíquela. Luego use los procesos TaskList / Ps del sistema operativo.

En Windows, mi comando se verá de la siguiente manera:

filterByPid = "PID eq %s" % pid
        pidStr = str(pid)
        commandArguments = ['cmd', '/c', "tasklist", "/FI", filterByPid, "|", "findstr",  pidStr ]

Básicamente, esto hace lo mismo que la siguiente línea de comando:

cmd /c "tasklist /FI "PID eq 55588" | findstr 55588"

Y en Linux, hago exactamente lo mismo usando:

pidStr = str(pid)
commandArguments = ['ps', '-p', pidStr ]

El comando ps ya devolverá el código de error 0/1 dependiendo de si se encuentra el proceso. Mientras está en Windows, necesita el comando buscar cadena.

Este es el mismo enfoque que se analiza en el siguiente hilo de desbordamiento de pila:

Verifique si un proceso se está ejecutando usando su PID en JAVA

NOTA: Si usa este enfoque, recuerde envolver su llamada de comando en un try / except:

try:
    foundRunningProcess = subprocess.check_output(argumentsArray, **kwargs)
    return True
except Exception as err:
    return False

Tenga en cuenta que tenga cuidado si está desarrollando con VS Code y utilizando Python y Jython puros. En mi entorno, tenía la ilusión de que el método poll () no funcionaba porque un proceso que sospechaba que debía haber terminado se estaba ejecutando. Este proceso había lanzado Wildfly. Y después de haber pedido que se detuviera wildfly, el shell todavía estaba esperando que el usuario “Presione cualquier tecla para continuar …”.

Para finalizar este proceso, en python puro funcionaba el siguiente código:

process.stdin.write(os.linesep)

En jython, tuve que arreglar este código para que tuviera el siguiente aspecto:

print >>process.stdin, os.linesep

Y con esta diferencia el proceso sí terminó. Y el jython.poll () comenzó a decirme que el proceso ha terminado.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *