
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 nohup
pero nohup
redirige stdin, stdout y stderr, algo que puede que desees o no. LeerDiferencia entre nohup
, disown
y&
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.ÑUparallel
es 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)
( --group
está 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. […]-k
só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 parallel
se usa para paralelizar múltiples curl
procesos y obtener el estado de salida de cada uno, conservando la secuencia.
En Debian, GNU parallel
está en un paquete llamado parallel
. Como ejecutable independiente, parallel
se puede ejecutar desde cualquier shell.
Respuesta2
La mejor manera de hacer esto es combinar nohup
el 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 connohup
y agregar &
hasta el final.
Entonces el comando final sería:
nohup [your command] &
Lo nohup
que 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.