Supongamos que tengo tres (o más) scripts bash: script1.sh
, script2.sh
, y script3.sh
. Me gustaría llamar a estos tres scripts y ejecutarlos en paralelo . Una forma de hacerlo es simplemente ejecutar los siguientes comandos:
nohup bash script1.sh &
nohup bash script2.sh &
nohup bash script3.sh &
(En general, los scripts pueden tardar varias horas o días en finalizar, por lo que me gustaría usarlos nohup
para que continúen ejecutándose incluso si mi consola se cierra).
Pero, ¿hay alguna forma de ejecutar esos tres comandos en paralelo con una sola llamada?
Estaba pensando algo como
nohup bash script{1..3}.sh &
pero esto parece ejecutarse script1.sh
, script2.sh
y script3.sh
en secuencia, no en paralelo.
nohup bash script{1..100}.sh &
ofor i in {1..100}; do nohup bash script{1..100} &; done
), en lugar de escribirnohup bash script*.sh &
100 veces diferentes.screen
(otmux
), para resolver el problema de la consola pero mantener el acceso a la salida (y entrada).nohup ... & nohup ... & nohup ... &
. Si, en cambio, quiere decir que desea ejecutar todos los scripts sin escribir cada nombre de script individualmente, lo hará un bucle simple.Respuestas:
fuente
Una mejor manera sería usar GNU Parallel . GNU paralelo es simple y con él podemos controlar la cantidad de trabajos que se ejecutarán en paralelo con más control sobre los trabajos.
En el siguiente comando,
script{1..3}.sh
se expande y se envía como argumentosbash
en paralelo. Aquí-j0
indica que se deben ejecutar tantos trabajos como sea posible. Por defectoparallel
ejecuta un trabajo para un núcleo de CPU.Y también puedes intentar usar
Si ejecuta el segundo método si recibe un mensaje de error, significa que esa
--tollef
opción está configurada/etc/parallel/config
y que debe eliminarse y todo funcionará bien.Puede leer la
GNU Parallels
página de manual aquí para obtener opciones más completas.Y en caso de que esté ejecutando los trabajos desde una máquina remota, mejor uso
screen
para que la sesión no se cierre debido a problemas de red.nohup
no es necesario, ya que las versiones recientes de fiesta como viene conhuponexit
tanoff
y esto evitará que la cáscara de los padres de enviarHUP
la señal a sus hijos durante su salida. En caso de que no esté desarmado, hágalo confuente
bash
ya que el caparazónparallel -j0 bash :::: <(ls script{1..3}.sh)
puede reducirseparallel -j0 bash :::: script{1..3}.sh
, ¿no?parallel -j0 bash ::: script{1..3}.sh
?bash ::: script{1..3}.sh
está pasando aparallel
, no::: script{1..3}.sh
. Por lo que esta primera debería ampliar aparallel bash ::: script1.sh script2.sh script3.sh
la concha y luegoparallel
invocaciones debash script1.sh
,bash script2.sh
,bash script3.sh
. Lo intentéparallel -j0 bash ::: script{1..3}.sh
; esto es mejor que el::::
enfoque, ya que evita la necesidad de sustitución del proceso. También el análisis de la salida de ls está plagado de dificultadesTambién podemos usar
xargs
para ejecutar múltiples secuencias de comandos en paralelo.aquí cada script se pasa a bash como argumento por separado.
-P 0
indica que el número de procesos paralelos puede ser lo máximo posible. También es más seguro que usar bash defaultjob control feature
(&)
.fuente
Una solución de línea única:
Menos graciosamente, solo use un script de envoltura:
O bucle sobre ellos:
fuente
Si está buscando ahorrar algo de esfuerzo de escritura
O pensándolo bien, tal vez no
fuente
Echa un vistazo a esta herramienta: https://github.com/wagoodman/bashful
Digamos que tienes
mytasks.yaml
conY lo ejecutas así:
Sus scripts se ejecutarán en paralelo con una barra de progreso vertical (+ eta si lo ha ejecutado antes y el tiempo es determinista). Puede ajustar cuántas tareas desea ejecutar en paralelo si comienza a ejecutar más que solo los 3 dados aquí:
Descargo de responsabilidad: soy el autor.
fuente
Estoy sugiriendo una utilidad mucho más simple que acabo de escribir. Actualmente se llama par, pero pronto cambiará su nombre a parl o pll, aún no lo he decidido.
https://github.com/k-bx/par
API es tan simple como:
fuente
Use paralelshell
https://github.com/keithamus/parallelshell
fuente