wait
es un comando que espera a que se completen los trabajos dados y devuelve el estado de salida del comando esperado.
Desde el wait
El comando afecta el entorno de ejecución de shell actual, se implementa como un comando integrado en la mayoría de los shells.
En este artículo, exploraremos el wait
incorporado de Bash comando.
Bash wait
Comando #
La sintaxis general de wait
incorporado toma la siguiente forma:
wait [options] ID
ID
es el ID del proceso o trabajo. Si no hay ID
se especifica, el comando espera hasta que se completen todos los trabajos secundarios en segundo plano.
La wait
comando devuelve el estado de salida del último comando esperado.
Por ejemplo, para esperar un proceso en segundo plano con PID 7654
, usarías:
wait 7654
Cuando se dan varios procesos, el comando espera a que se completen todos los procesos.
Los trabajos se especifican utilizando la especificación de trabajo ("jobspec"), que es una forma de referirse a los procesos que componen el trabajo. Una especificación de trabajo comienza con un símbolo de porcentaje seguido del número de trabajo (%n
). Aquí hay un ejemplo:
Ejecute un comando en segundo plano:
rsync -a /home /tmp/home &
El ID del trabajo de shell (entre corchetes) y el ID del proceso se mostrarán en su terminal:
[2] 54377
Para esperar el trabajo, ejecute wait
comando seguido de la especificación del trabajo:
wait %2
Cuando se invoca con -n
opción, el comando espera solo a que se complete un solo trabajo de los pid o especificaciones de trabajo dados y devuelve su estado de salida. Si no se proporcionan argumentos, wait -n
espera a que se complete cualquier trabajo en segundo plano y devuelva el estado de salida del trabajo.
wait -n 45432 54346 76573
En el ejemplo anterior, wait -n
solo imprime el estado de retorno del trabajo que sale primero; no muestra el PID del trabajo. Si desea obtener el pid del trabajo o la especificación del trabajo para el que se devuelve el estado de salida, use -p
opción para asignarlo a una variable:
wait -p job_id -n 45432 54346 76573
-p
La opción se introdujo en Bash 5.1. Si usa una versión anterior de Bash, obtendrá un error de "opción no válida".
El -f
opción le dice a wait
esperar a que cada pid o especificación de trabajo finalice realmente antes de devolver su código de salida, en lugar de regresar cuando se cambia el estado del trabajo. Esta opción solo es válida cuando el control de trabajos está habilitado. De forma predeterminada, el control de trabajos está habilitado solo para indicaciones interactivas.
Ejemplos #
wait
se usa típicamente en scripts de shell que generan procesos secundarios que se ejecutan en paralelo.
Para ilustrar cómo funciona el comando, cree el siguiente script:
#!/bin/bash
sleep 30 &
process_id=$!
echo "PID: $process_id"
wait $process_id
echo "Exit status: $?"
Expliquemos el código línea por línea:
- La primera línea se llama shebang y le dice al sistema operativo qué intérprete usar para analizar el resto del archivo.
- Estamos usando el
sleep
Comando para emular un proceso en segundo plano que requiere mucho tiempo. $!
es una variable interna de Bash que almacena el PID del último trabajo ejecutado en segundo plano. En este ejemplo, ese es el PID delsleep
dominio. Estamos almacenando el PID en una variable (process_id
).- Imprime el número PID.
- El PID se pasa al
wait
comando que espera hasta quesleep
el comando se completa. - Imprime el estado de salida de
wait
dominio.$?
es una variable interna de Bash que contiene el estado de salida del último comando ejecutado.
Si ejecuta el script, imprimirá algo como esto:
PID: 36353
Exit status: 0
Aquí un ejemplo usando el -n
opción:
#!/bin/bash
sleep 3 &
sleep 30 &
sleep 5 &
wait -n
echo "First job completed."
wait
echo "All jobs completed."
Cuando se ejecuta el script, genera 3 procesos en segundo plano. wait -n
espera hasta que se complete el primer trabajo y se imprima la declaración de eco. wait
espera a que se completen todos los trabajos secundarios en segundo plano.
first job completed
all jobs completed
El último ejemplo explica el -f
opción. Abre la terminal y ejecuta:
sleep 3600 &
[1] 46671
Espere el proceso:
wait 46671
Abra otra terminal y detenga el proceso con kill
comando:
kill -STOP 46671
Una vez que se cambia el estado del proceso, wait
el comando se completará y devolverá el código de salida del proceso.
Ahora, repite los mismos pasos, pero esta vez usa wait -f $pid
:
sleep 3600 &
wait -f 46671
Detener el proceso desde la otra terminal:
kill -STOP 46671
Esta vez el wait
el comando no se completará. Se ejecutará hasta que sleep
el proceso termina.
Conclusión #
La wait
El comando espera a que se completen los trabajos especificados y devuelve el código de salida del trabajo.