Tengo script. Siempre me gustaría ejecutar instancias 'x' en paralelo.
El código se ve así:
for A in do for B in do (script1.sh $A $B;script2.sh $A $B) & done #B done #A
Los scripts en sí ejecutan consultas DB, por lo que se beneficiaría de la ejecución paralela. El problema es
1) 'wait' no funciona (porque finalizó todos los trabajos en segundo plano e inicia nuevos (incluso si incluyo un contador de hilos), eso desperdicia mucho time.
2) No pude entender cómo hacer paralelo para hacer eso. Solo encontré ejemplos donde el mismo script se ejecuta varias veces, pero no con diferentes parameters.
3) la solución alternativa sería:
for A in do for B in do while threadcount>X do sleep 60 done (script1.sh $A $B;script2.sh $A $B) & done #B done #A
Pero realmente no descubrí cómo hacer que el conteo de hilos sea confiable.
Algunos consejos en la dirección correcta son muy bienvenidos.
Me encantaría usar paralelo, pero la cosa simplemente no funciona, como me dice la documentation.
hago
parallel echo ::: ABC ::: DEF
(del doc) y me dice
parallel: Input is read from the terminal. Only experts do this on purpose. Press CTRL-D to exit.
y ese es solo el ejemplo más simple de las páginas man.
Usando GNU Parallel se ve así:
parallel script1.sh {}';' script2.sh {} ::: abc ::: def
Desarrollará un trabajo por CPU.
GNU Parallel es un paralelizador general y hace que sea fácil ejecutar trabajos en paralelo en la misma máquina o en varias máquinas a las que tiene acceso ssh. A menudo puede replace un bucle for
.
Si tiene 32 trabajos diferentes que desea ejecutar en 4 CPU, una manera directa de paralelizar es ejecutar 8 trabajos en cada CPU:
En cambio, GNU Parallel genera un nuevo process cuando uno finaliza, manteniendo las CPU activas y ahorrando time:
Instalación
Si GNU Parallel no está empaquetado para su distribución, puede hacer una installation personal, que no requiere acceso a la raíz. Se puede hacer en 10 segundos al hacer esto:
(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash
Para otras opciones de installation, vea http://git.savannah.gnu.org/cgit/parallel.git/tree/README
Aprende más
Vea más ejemplos: http://www.gnu.org/software/parallel/man.html
Mira los videos introductorios: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
Repase el tutorial: http://www.gnu.org/software/parallel/parallel_tutorial.html
Regístrese para get la list de correo electrónico para get asistencia: https://lists.gnu.org/mailman/listinfo/parallel
Creo que puedes hacer esto con xargs:
for A in abc do for B in def do echo $A $B; done; done | xargs -I {} -P4 bash -c "script1.sh {}; script2.sh {}"
Donde -P4 dice ejecutar 4 instancias en paralelo; Tendrás que especificar algún valor para eso.