2012-06-28 16 views
7

Tengo el siguiente script bash, podemos llamarlo script1.sh:¿Cómo comprobar si un trabajo en segundo plano está activo? (Bash)

#!/bin/bash 

exec ./script2.sh & 

sleep 5 

if job1 is alive then #<--- this line is pseudo-code! 
    exec ./script3.sh & 
    wait 
fi 

Como puede verse, el script se ejecuta script2.sh como un trabajo en segundo plano y espera 5 segundos (por lo script2.sh puede hacer algo de inicialización cosas). Si la inicialización tiene éxito, el trabajo script2.sh seguirá vivo, en cuyo caso también deseo iniciar script3.sh al mismo tiempo; si no, solo quiero dejarlo.

Sin embargo, no sé cómo comprobar si el primer trabajo está vivo, de ahí la línea de pseudocódigo. Entonces, ¿qué debería ir en su lugar?

+2

Ejecutando exec no hará lo que piensas. Reemplazará el proceso actual con un nuevo proceso; No se alcanzarán las líneas posteriores en su script. –

Respuesta

9

Puede obtener el PID del trabajo en segundo plano más reciente con $!. Luego, puede verificar el estado de salida de ps para determinar si ese PID en particular aún se encuentra en la lista de procesos. Por ejemplo:

sleep 30 & 
if ps -p $! >&-; then 
    wait $! 
else 
    jobs 
fi 
+2

Ese comando exacto me da el error ps: error de escritura: Bad Filedescriptor – FORTRAN

+0

Esto no siempre funciona. Por ejemplo, en Alpine Linux, el valor predeterminado "ps" está vinculado a BusyBox, que no admite el modificador -p. Utilizar 'bash' built-ins como' trabajos' es más portátil. –

3

No estoy seguro de Exec funciona con el fondo, ya que sustituye la imagen del proceso padre con la del proceso hijo, de lo contrario, si asumimos que deshacerse de ejecutivo, que querría algo así como:

#!/bin/bash 
./script2.sh& 
pid1=$! 

if kill -0 $pid1; then 
    ./script3.sh& 
    pid3=$! 
    wait 
fi 
6

puede comprobar si una señal es entregable

./script2 & 
myPid=$! 
sleep 5 

if kill -0 "$myPid"; then 
    script3 & 
    wait 
fi 
0

Tenga una mirada en el comando jobs; enumera todos los trabajos en ejecución.

4

Para ampliar la respuesta de fduff puede utilizar el jobs orden interna:

if jobs %% 
    exec ./script3.sh & 
    wait 
fi 

jobs %% imprime el ID de trabajo de la más reciente proceso de fondo (el "trabajo actual") y devuelve 0 en éxito o 1 si no hay tal trabajo.

Cuestiones relacionadas