Si tengo un archivo con
cmd1
cmd2
cmd3
Y quiero ejecutarlos independientemente uno del otro, e independientemente de si genera un estado de salida o no (eso significa que no espere finalizar, simplemente siga iniciando procesos, que pueden fallar o no. Sé que ;
ejecutaría el siguiente comando, pero ese no es el caso, porque espera hasta que el comando anterior falla o tiene éxito. Quiero iniciar todos los comandos a la vez.
Es como algo como sleep 60m
; y luego reproducir música, hacer sonar una campana, ejecutar el navegador, pero obviamente, no hay forma de esperar hasta que suene la música para hacer sonar una campana y luego ejecutar el navegador. Tiene que suceder de inmediato.
AGREGADO: cómo, por ejemplo,
¿Leer líneas del archivo, abrir una terminal para cada línea y ejecutarlo?
Respuesta1
Simplemente agregando un signo al final de cada línea, todos los comandos pasarán a un segundo plano.
cmd1 &
cmd2 &
cmd3 &
Ejemplo
$ more at_once.bash
#!/bin/bash
echo "1" && sleep 10 &
echo "2" && sleep 10 &
echo "3" && sleep 10 &
pgrep -a sleep
Ahora, cuando ejecutamos este script:
$ ./at_once.bash
1
3
2
7533 sleep 10
7535 sleep 10
7536 sleep 10
Incluso puede ver que las tareas se ejecutaron desordenadas debido a su naturaleza en segundo plano y el tercer comando se repitió antes que el segundo. Muestra pgrep sleep
que los 3 comandos en segundo plano se están ejecutando al mismo tiempo.
NOTA:Utilicé la notación echo "X" && sleep 10
simplemente para mostrar que los comandos se ejecutaban en segundo plano. Esta notación no tiene nada que ver con el fondo en sí, el final &
es lo que "pone" los sleep 10
comandos en segundo plano.
También puedes usarlo &
como separador si prefieres hacer esto en una sola línea de comando:
$ sleep 10 & sleep 10 & sleep 10 &
[1] 7731
[2] 7732
[3] 7733
Comprobando esta línea:
$ pgrep -a sleep
7731 sleep 10
7732 sleep 10
7733 sleep 10
Nuevamente los vemos todos ejecutándose simultáneamente. Si tuviera que utilizar un punto y coma:
$ sleep 10 ; sleep 10 ; sleep 10
Los sleep 10
comandos se ejecutarían en serie y tardarían 30 segundos en completarse, en comparación con los comandos en paralelo, que solo tardarían 10 segundos.