Ejecute series de comandos independientes entre sí.

Ejecute series de comandos independientes entre sí.

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 sleepque los 3 comandos en segundo plano se están ejecutando al mismo tiempo.

NOTA:Utilicé la notación echo "X" && sleep 10simplemente 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 10comandos 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 10comandos 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.

información relacionada