Ejecute dos o más comandos simultáneamente en un script de shell

Nov 28 2020

A menudo es muy útil ejecutar comandos en paralelo en un script de shell, pero no puedo encontrar formas de hacerlo. es posible? Si es así, ¿cómo lo lograría? Principalmente estoy interesado en hacer eso fish.

Es útil cuando ejecuto comandos que tardan mucho en completarse pero que pueden o deben ejecutarse al mismo tiempo para reducir el tiempo que tarda todo en finalizar.

Respuestas

5 KamilMaciorowski Nov 28 2020 at 16:03

El enfoque más básico es con &, esta otra respuesta es correcta. También defiende nohuppero nohupredirige stdin, stdout y stderr, algo que puede que desee o no. Leer Diferencia entre nohup, disowny& y tomar una decisión educada.

Otro enfoque es parallel. Será útil si los comandos que desea paralelizar son similares entre sí y puede crear un patrón.

La variante básica de la herramienta (de moreutils, al menos en Debian ) le permite limitar el número de trabajos que se ejecutan al mismo tiempo. GNUparallel es más avanzado. Si los trabajos que desea ejecutar generan resultados, las siguientes opciones serán particularmente útiles:

--group
Salida de grupo. La salida de cada trabajo se agrupa y solo se imprime cuando finaliza el comando. Stdout (salida estándar) primero seguido de stderr (error estándar). […]

( fuente )

( --groupestá habilitado de forma predeterminada, por lo que normalmente no es necesario utilizarlo explícitamente).

--keep-order
-k
Mantenga la secuencia de salida igual que el orden de entrada. Normalmente, la salida de un trabajo se imprimirá tan pronto como se complete el trabajo. […] -kSolo afecta el orden en el que se imprime la salida, no el orden en que se ejecutan los trabajos.

( fuente )

Con ellos se organizará la salida de varios trabajos, algo de lo que no se puede obtener &. A veces puede que no le importe la salida, pero aún así le importe la secuencia; como en esta respuesta mía, donde GNU parallelse usa para paralelizar múltiples curlprocesos y obtener el estado de salida de cada uno, conservando la secuencia.

En Debian GNU parallelestá en un paquete llamado parallel. Como un ejecutable independiente parallelse puede ejecutar desde cualquier shell.

2 Giacomo1968 Nov 28 2020 at 11:12

La mejor manera de hacer esto es combinar el nohupprefacio del comando con el &agregado al final del comando

No está claro cuál es su objetivo principal, ¡pero espero la ayuda!

Para ejecutar cualquier comando como proceso en segundo plano en una máquina Linux, debe anteponer el comando nohupy agregarlo &al final.

Entonces el comando final sería:

nohup [your command] &

Los nohupmedios que el comando debe ignorar los "cuelgues" y el signo comercial &adjunto es un comando de shell que le dice al sistema que ejecute el comando como proceso en segundo plano. Puede encontrar más información sobre su uso aquí .

Cuando ejecuta un comando como este, el proceso se ejecutará, se le enviará de regreso al símbolo del sistema y podrá salir de la sesión de terminal o incluso ir y hacer otra cosa no relacionada con ese comando durante esa sesión de terminal.