2011-03-05 19 views
16

Quiero detener la ejecución de mi script BASH hasta que se cierre un proceso (tengo el PID almacenado en una variable). Estoy pensando
while [ PID IS RUNNING]; do
sleep 500
done
BASH - Compruebe si existe PID

La mayoría de los ejemplos que he visto utilizan/dev/null que parece requerir root. ¿Hay alguna manera de hacer esto sin necesidad de root?

¡Muchas gracias de antemano!

+3

Salida http://stackoverflow.com/questions/356100/how-to-wait-in-bash-for-several-subprocesses- to-finish-and-return-exit-code-0-w – atk

+1

Consulte [Gestión de procesos] (http://mywiki.wooledge.org/ProcessManagement). ¿Puedes mostrar un ejemplo de uso de '/ dev/null' que requiere root? No puedo imaginar cómo sería ese el caso ni cómo sería aplicable a este caso. –

+0

¿Qué uso de/dev/null parece requerir la raíz? No puedo pensar en ninguno. – ndemou

Respuesta

31

kill -s 0 $pid volverá éxito si $pid se está ejecutando, el fracaso de otro modo, sin tener que enviar una señal al proceso, por lo que puede usar eso en su declaración if directamente.

wait $pid esperará en ese proceso, en sustitución de toda su bucle.

+1

Gracias. Aquí está mi código actual: 'while sleep 1; mata -0 $ PIDD || descanso; hecho'. – JohnP

+9

Nota: 'kill -0 $ pid' solo funciona para procesos que usted posee. 'ps -p $ pid' funcionará para cualquier proceso. – sligocki

+2

Nota: 'wait $ pid' solo funciona si eres el padre de' $ pid'. – Harish

7

Puede buscar la presencia del directorio /proc/YOUR_PID.

+2

Eso está bien, si solo ejecuta el script en Linux. Para asegurar la compatibilidad, es mejor usar el truco 'kill -s' dado anteriormente. – Zouppen

+0

En mis pruebas, veo que el directorio se cuelga por un corto tiempo después de que el proceso ha muerto – Bryan

3

siempre uso el siguiente tail -f /dev/null --pid $PID. No requiere un ciclo explícito y no está limitado a las pids secundarias de su caparazón solamente.

+0

El comando 'tail' en FreeBSD y OSX no incluye una opción' --pid'. Si el OP no está preguntando sobre un sistema operativo en particular, debe calificar las respuestas que proporcione que sean específicas de la plataforma. – ghoti

16

Parece que usted quiere

wait $pid 

que devolverá cuando $pid acabados.

contrario, puede utilizar

ps -p $pid 

para comprobar si el proceso está todavía vivo (esto es más eficaz que kill -0 $pid porque va a trabajar incluso si usted no es dueño del PID).

1

ps --pid $pid &>/dev/null

devuelve 0 si es que existe, de lo contrario 1

+0

La opción '--pid' para' ps' puede funcionar en su sistema operativo, pero no funciona en el mío. ¿El OP mencionó qué sistema operativo está ejecutando? De lo contrario, debe calificar las respuestas que proporcione, que sean específicas del sistema operativo y no portátiles. – ghoti

+0

Bastante justo. '--pid' funciona en Ubuntu 12.04. –