bash - Ejecutar programas en paralelo usando xargs
parallel-processing (2)
Con GNU Parallel harías:
parallel script-to-run.sh input/ output/ {} ::: {0..99}
Agregue
-P8
si
no
desea ejecutar un trabajo por núcleo de CPU.
Enfrente de
xargs
, hará lo correcto, incluso si la entrada contiene espacio, ''o "(no es el caso aquí, sin embargo). También se asegura de que la salida de diferentes trabajos no se mezcle, así que si usa la salida, están garantizados que no obtendrá media línea de dos trabajos diferentes.
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.
Si tiene 32 trabajos diferentes que desea ejecutar en 4 CPU, una forma directa de paralelizar es ejecutar 8 trabajos en cada CPU:
GNU Parallel genera un nuevo proceso cuando uno termina, manteniendo las CPU activas y ahorrando tiempo:
Instalación
Si GNU Parallel no está empaquetado para su distribución, puede hacer una instalación personal, que no requiere acceso de root. Se puede hacer en 10 segundos haciendo esto:
$ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || /
fetch -o - http://pi.dk/3 ) > install.sh
$ sha1sum install.sh | grep 3374ec53bacb199b245af2dda86df6c9
12345678 3374ec53 bacb199b 245af2dd a86df6c9
$ md5sum install.sh | grep 029a9ac06e8b5bc6052eac57b2c3c9ca
029a9ac0 6e8b5bc6 052eac57 b2c3c9ca
$ sha512sum install.sh | grep f517006d9897747bed8a4694b1acba1b
40f53af6 9e20dae5 713ba06c f517006d 9897747b ed8a4694 b1acba1b 1464beb4
60055629 3f2356f3 3e9c4e3c 76e3f3af a9db4b32 bd33322b 975696fc e6b23cfb
$ bash install.sh
Para otras opciones de instalación, consulte http://git.savannah.gnu.org/cgit/parallel.git/tree/README
Aprende más
Ver más ejemplos: http://www.gnu.org/software/parallel/man.html
Mira los videos de introducción: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
Recorre el tutorial: http://www.gnu.org/software/parallel/parallel_tutorial.html
Regístrese en la lista de correo electrónico para obtener asistencia: https://lists.gnu.org/mailman/listinfo/parallel
Actualmente tengo el script actual.
#!/bin/bash
# script.sh
for i in {0..99}; do
script-to-run.sh input/ output/ $i
done
Deseo ejecutarlo en paralelo usando xargs. Yo he tratado
script.sh | xargs -P8
Pero hacer lo anterior solo se ejecuta una vez a la vez. No hubo suerte con -n8 también. Agregar & al final de la línea a ejecutar en el script for loop intentaría ejecutar el script 99 veces a la vez. ¿Cómo ejecuto el bucle solo 8 a la vez, hasta 100 en total?
Desde la página de manual de
xargs
:
Esta página del manual documenta la versión GNU de xargs. xargs lee elementos de la entrada estándar, delimitados por espacios en blanco (que se pueden proteger con comillas dobles o simples o una barra diagonal inversa) o líneas nuevas, y ejecuta el comando (el valor predeterminado es / bin / echo) una o más veces con cualquier argumento inicial seguido por elementos leídos de la entrada estándar. Las líneas en blanco en la entrada estándar se ignoran.
Lo que significa que para su ejemplo,
xargs
está esperando y recolectando toda la salida de su script y luego ejecuta
echo <that output>
.
No es exactamente todo lo útil ni lo que querías.
El argumento
-n
es cuántos elementos de la entrada usar con cada comando que se ejecuta (nada, por sí mismo, sobre el paralelismo aquí).
Para hacer lo que quieras con
xargs
deberías hacer algo más como esto (no probado):
printf %s//n {0..99} | xargs -n 1 -P 8 script-to-run.sh input/ output/
Que se descompone así.
-
printf %s//n {0..99}
- Imprime un número por línea de0
a99
. -
Ejecuta
xargs
- tomando como máximo un argumento por línea de comando de ejecución
- y ejecuta hasta ocho procesos a la vez