¿Cómo ejecutar x instancias de un script paralelo?

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:

Programación simple

En cambio, GNU Parallel genera un nuevo process cuando uno finaliza, manteniendo las CPU activas y ahorrando time:

Programación paralela de GNU

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.