¿Cómo se ejecutan varios programas en paralelo desde un script bash?
Estoy intentando escribir un archivo .sh que ejecute muchos programas simultáneamente
Probé esto
prog1
prog2
Pero eso ejecuta prog1, luego espera hasta que finalice prog1 y luego inicia prog2...
Entonces, ¿cómo puedo ejecutarlos en paralelo?
Qué tal si:
prog1 & prog2 && fg
Esta voluntad:
- Comenzar
prog1
. - Envíelo al fondo, pero siga imprimiendo su resultado.
- Inicie
prog2
y manténgalo en primer plano para poder cerrarlo conctrl-c
. - Cuando cierres
prog2
, volverás alprog1
primer plano , por lo que también podrás cerrarlo conctrl-c
.
Para ejecutar varios programas en paralelo:
prog1 &
prog2 &
Si necesita que su script espere a que finalicen los programas, puede agregar:
wait
en el punto donde desea que el script los espere.
Si desea poder ejecutar y eliminar fácilmente varios procesos con ctrl-c
, este es mi método favorito: generar múltiples procesos en segundo plano en un (…)
subshell y capturar SIGINT
para ejecutar kill 0
, lo que eliminará todo lo generado en el grupo de subshell:
(trap 'kill 0' SIGINT; prog1 & prog2 & prog3)
Puede tener estructuras de ejecución de procesos complejas y todo se cerrará con un solo proceso ctrl-c
(solo asegúrese de que el último proceso se ejecute en primer plano, es decir, no incluya un &
después prog1.3
):
(trap 'kill 0' SIGINT; prog1.1 && prog1.2 & (prog2.1 | prog2.2 || prog2.3) & prog1.3)
Si existe la posibilidad de que el último comando se cierre antes y desea mantener todo lo demás en ejecución, agréguelo wait
como último comando. En el siguiente ejemplo, sleep 2
habría salido primero y habría matado sleep 4
antes de terminar; agregar wait
permite que ambos se ejecuten hasta su finalización:
(trap 'kill 0' SIGINT; sleep 4 & sleep 2 & wait)