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

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

A menudo resulta muy útil ejecutar comandos en paralelo en un script de shell, pero no encuentro la manera de hacerlo. es posible? Si es así, ¿cómo lo lograría? Estoy principalmente interesado en hacer eso para fish.

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

Respuesta1

El enfoque más básico es con &,esta otra respuestaes correcto. También recomienda nohuppero nohupredirige stdin, stdout y stderr, algo que puede que desees o no. LeerDiferencia entre nohup, disowny&y tomar una decisión informada.

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

Variante básica de la herramienta (de moreutils, al menosen Debian) le permite limitar la cantidad de trabajos que se ejecutan al mismo tiempo.ÑUparalleles más avanzado. Si los trabajos que desea ejecutar generan resultados, las siguientes opciones serán particularmente útiles:

--group
Salida grupal. 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 usarlo explícitamente).

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

(fuente)

Con ellos se organizará la salida de múltiples trabajos, algo que no se puede obtener &. A veces puede que no te importe el resultado, pero sí te importa la secuencia; como enesta respuesta míadonde 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 ejecutable independiente, parallelse puede ejecutar desde cualquier shell.

Respuesta2

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

No está claro cuál es su objetivo principal, ¡pero espero que le ayude!

Para ejecutar cualquier comando como proceso en segundo plano en una máquina Linux, debe anteponer el comando connohupy agregar &hasta el final.

Entonces el comando final sería:

nohup [your command] &

Lo nohupque significa que el comando debe ignorar los "cuelgues" y el signo comercial &adjunto es un comando de shell que le indica al sistema que ejecute el comando como proceso en segundo plano. Más información sobre su usose puede encontrar 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 hacer algo más que no esté relacionado con ese comando durante esa sesión de terminal.

información relacionada