Ejecute el mismo comando varias veces en segundo plano


14

¿Cómo es posible ejecutar múltiples comandos y ponerlos en segundo plano usando bash?

Por ejemplo:

$ for i in {1..10}; do wait file$i &; done

donde wait es un binario personalizado.

En este momento me sale un error:

syntax error near unexpected token `;'

cuando ejecuta el comando anterior.

Una vez en segundo plano, los comandos deben ejecutarse en paralelo.


1
Estoy diciendo que no te refieres a: nohuppermitirte ejecutar un comando en segundo plano
Dave Hamilton

3
El error que está viendo se debe &y ;son "terminadores de comando". No necesita usar ambos: for ...; do wait $arg & donefuncionará.
Glenn Jackman

@glenn jackman. Sí, en realidad lo intenté después de publicar la pregunta. No hay necesidad de ambos; y &
Sebi

3
Para futuros lectores, un enlace a la documentación : "Una lista es una secuencia de una o más canalizaciones separadas por uno de los operadores ';', '&', '&&' o '||', y opcionalmente terminada por uno de ';', '&' o una nueva línea ". (énfasis mío)
Glenn Jackman

Respuestas:


21

El &, al igual que ;es un operador terminador de lista . Tienen la misma sintaxis y se pueden usar indistintamente (dependiendo de lo que quieras hacer). Esto significa que no quieres, o necesitas command1 &; command2, todo lo que necesitas es command1 & command2.

Entonces, en tu ejemplo, podrías escribir:

for i in {1..10}; do wait file$i & done

y cada waitcomando se iniciará en segundo plano y el bucle pasará inmediatamente al siguiente.


4

En aras de la compatibilidad, utilice la forma posix en lugar de la expansión:

for i in $(seq 1 10); do (./wait file$i &); done

1
Tenga en cuenta que seqno es un comando POSIX y generalmente solo se encuentra en sistemas GNU. El comportamiento o $(...)(y $i) depende del valor actual de $IFS. También tenga en cuenta que al hacerlo (cmd &), cmdserá hijo de una subshell, por lo que no podrá esperar y obtener su estado de salida, por ejemplo.
Stéphane Chazelas

2

Puede agrupar los comandos y poner los comandos agrupados en segundo plano. Me gusta :

$ for i in {1..10}; do ((wait file$i)&); done

No hay necesidad de utilizar los paréntesis interiores ...
Marc

solo necesita usar los paréntesis internos si desea poner en segundo plano múltiples comandos como se le preguntó en la pregunta. Me gusta ((dormir 1; esperar archivo $ i) &);
mazs

2

¿Su binario se llama realmente wait? No recomiendo hacerlo, porque waites una concha incorporada.

Creo que bash no analiza bien un bucle de una línea que inicia procesos en segundo plano. Le sugiero que cambie el código a:

$ for i in {1..10}; do ./wait file$i & echo "Running 'wait' using PID=$!..."; done
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.