Wait es un comando de shell que espera a que se complete un proceso determinado y luego devuelve su estado de salida. El comando de espera se utiliza para esperar un ID de proceso o un ID de trabajo en particular y devolver su estado de terminación.
Al ejecutar el gran flujo de automatización, necesitamos hacer que algunos módulos deban esperar hasta que se complete el conjunto anterior de módulos y devolver los datos canalizados a los siguientes módulos, en este caso podemos usar el comando Esperar hasta completar el módulo anterior.
Cómo funciona el comando de espera
El comando de espera utilizado para monitorear el proceso anterior, depende del estado de retorno del proceso anterior, devolverá el estado de salida. Por ejemplo, si queremos esperar para completar un proceso particular ID 13245, entonces debemos usar "esperar 13245" cuando el comando de espera completo del proceso 13245 devuelve los valores de retorno del estado de salida 13245.
- PID de espera (PID - ID de proceso de un comando, para el cual la utilidad espera la finalización).
- JID de espera (JID:ID de trabajo que identifica un proceso en segundo plano para esperar, aplicable solo para invocaciones de espera en el entorno de ejecución de shell actual).
El valor del estado de salida del comando de espera depende del último PID/JID especificado. Cuando cualquier proceso termina de manera anormal, el estado de salida será mayor que 128.
El comando de espera sale con el valor 0
cuando llama sin ningún proceso secundario y todos los ID de proceso conocidos por el shell actual han terminado. Si el comando de espera detecta algún error, devuelve cualquier valor del 1 al 126. Si se desconoce la última identificación del proceso, el comando de espera finaliza con el valor 127.
Ejemplos de comandos de espera
Revisemos algunos scripts para comprender cómo funciona el comando de espera.
Ejemplo:1 – Script con comando de espera
Tenemos dos scripts llamados 'foo.sh' y 'bar.sh' script. El script 'Foo.sh' imprime números entre 1 y 5 y el script 'bar.sh' llamará a foo.sh y lo ejecutará en segundo plano, obtendrá el PID de foo.sh y esperará a que se complete, una vez que se complete inicie el ciclo 'bar.sh' y complete.
Guión – foo.sh
#!/bin/bash
for i in 1 2 3 4 5
do
echo “foo.sh – Looping … number $i”
done
Guión – bar.sh
#!/bin/bash
echo “Started bar.sh”
echo “Started foo.sh”
./foo.sh &
pid=$!
wait $pid
echo “Completed foo.sh”
for I in 1 2 3 4 5
do
echo “bar.sh – Looping … number $i”
done
Resultado
Started bar.sh
Started foo.sh
foo.sh – Looping .. number 1
foo.sh – Looping .. number 2
foo.sh – Looping .. number 3
foo.sh – Looping .. number 4
foo.sh – Looping .. number 5
Completed foo.sh
bar.sh – Looping .. number 1
bar.sh – Looping .. number 2
bar.sh – Looping .. number 3
bar.sh – Looping .. number 4
bar.sh – Looping .. number 5
Completed bar.sh
$
Ejemplo 2 – Script sin comando de espera
Tenemos dos scripts llamados 'foo.sh' y 'bar.sh' script. El script 'foo.sh' imprime números entre 1 y 5 y el script bar.sh llamará a foo.sh y lo ejecutará en segundo plano, pero no esperará a que foo.sh complete y ejecute ambos scripts.
Guión – foo.sh
#!/bin/bash
for i in 1 2 3 4 5
do
echo “foo.sh – Looping … number $i”
done
Guión – bar.sh
#!/bin/bash
echo “Started bar.sh”
echo “Started foo.sh”
./foo.sh &
echo “Completed foo.sh”
for I in 1 2 3 4 5
do
echo “bar.sh – Looping … number $i”
done
Resultado
Started bar.sh
Started foo.sh
Completed foo.sh
bar.sh – Looping .. number 1
bar.sh – Looping .. number 2
bar.sh – Looping .. number 3
bar.sh – Looping .. number 4
bar.sh – Looping .. number 5
Completed bar.sh
$
foo.sh – Looping .. number 1
foo.sh – Looping .. number 2
foo.sh – Looping .. number 3
foo.sh – Looping .. number 4
foo.sh – Looping .. number 5
$
Ejemplo:3 – Script con comando de espera y estado de retorno
El script 'bar.sh' llamará a foo.sh y lo ejecutará en segundo plano, obtendrá el PID de foo.sh y esperará a que se complete, una vez que se complete, iniciará el bucle bar.sh y se completará. Finalmente, devolverá el código de salida del script foo.sh.
Guión:foo.sh (Estado de salida =0)
Guión - foo.sh
#!/bin/bash
for i in 1 2 3 4 5
do
echo “foo.sh – Looping … number $i”
done
Guión – bar.sh
#!/bin/bash
./foo.sh &
BPID=$!
wait $BPID
stat=$?
if [ $stat –eq 0 ]
then
echo “Exit status - $stat”
else
echo “Exit status - $stat”
fi
Resultado
foo.sh – Looping .. number 1
foo.sh – Looping .. number 2
foo.sh – Looping .. number 3
foo.sh – Looping .. number 4
foo.sh – Looping .. number 5
Exit status - 0
$
Script – foo.sh (Estado de salida =NON Zero)
Guión - foo.sh
#!/bin/bash
for i in 1 2 3 4 5
do
iiecho “foo.sh – Looping … number $i”
done
Guión – bar.sh
#!/bin/bash
./foo.sh &
BPID=$!
wait $BPID
stat=$?
if [ $stat –eq 0 ]
then
echo “Exit status - $stat”
else
echo “Exit status - $stat”
fi
Resultado
./foo.sh: line 4: iiecho: command not found
./foo.sh: line 4: iiecho: command not found
./foo.sh: line 4: iiecho: command not found
./foo.sh: line 4: iiecho: command not found
./foo.sh: line 4: iiecho: command not found
Exit status – 127
$
Conclusión
Wait y Sleep son llamadas al sistema basadas en el tiempo en el sistema operativo. Veamos la diferencia entre los comandos de espera y suspensión.
Espera:cuando el usuario desea detener el proceso actual y libera todos los recursos retenidos por el proceso y espera a que se ejecute algún otro proceso. Necesitamos usar notificar para que este proceso sea consciente de que comience la ejecución nuevamente al finalizar otro proceso.
Suspender:esta llamada al sistema se utiliza cuando el usuario desea detener el proceso actual durante algún tiempo. Mantiene los bloqueos en los recursos hasta que finaliza el tiempo de suspensión y nuevamente comienza la ejecución del proceso. Aquí el proceso tiene control a lo largo de la ejecución. por ejemplo, ejecuté algún comando en bash y quiero dormir por un tiempo ya que esperaba algún resultado del comando ejecutado que se utilizará en la ejecución posterior del proceso actual.