2012-07-11 13 views
5

He estado utilizando Bash para esperar hasta que ya no exista un PID. He intentadoBash: Utilizar while o hasta esperar hasta que no exista un PID

#!/bin/bash 
while [ kill -0 PID > /dev/null 2>&1 ]; do 
    //code to kill process 
done 
//code to execute after process is dead 

, así como

#!/bin/bash 
until [ ! kill -0 PID > /dev/null 2>&1 ]; do 
    //code to kill process 
done 
//code to execute after process is dead 

Estos dos ejemplos bien impedir su correcto funcionamiento o mantener el bucle después de que el proceso ha terminado. ¿Qué estoy haciendo incorrectamente?

+0

¿Puede usted no sólo tiene que utilizar 'esperar "$ PID"'? –

+0

Volvería que el PID no era un hijo del caparazón. – hexacyanide

+0

** A menos que ** el proceso que mira es _un proceso hijo_, existen varias dificultades. Ver [este comentario] (http://stackoverflow.com/questions/1058047/wait-for-any-process-to-finish/1127675#comment24774342_1058047) para más detalles. –

Respuesta

15

Usted debe ser simplemente haciendo:

while kill -0 $PID >/dev/null 2>&1 
do 
    # Code to kill process 
done 

La condición del bucle comprueba el estado de salida del último comando — en este caso, kill.

El significado de 'última' es que se podría escribir:

while sleep 1 
     echo Testing again 
     kill -0 $PID >/dev/null 2>&1 
do 
    # Code to kill process 
done 

Esto también comprueba el estado de salida de kill (y kill solo).

+0

Puede valer la pena agregar una nota que explique que 'kill -0' verifica el proceso. No es exactamente intuitivo ... – Nagev

+0

Supongo que no es obvio, pero se usó en la pregunta, por lo que no fue necesario explicar el OP. –

4

también se puede hacer en sistemas Unix con procfs (casi todos, excepto Mac OS)

while test -d /proc/$PID; do 
    kill -$SIGNAL $PID 
    # optionally 
    sleep 0.2 
done 
+1

esto no funcionará en un mac – Somatik

+0

No noté que mac no tiene procfs. –

Cuestiones relacionadas