bash parallel-processing xargs

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 de 0 a 99 .
  • Ejecuta xargs
    • tomando como máximo un argumento por línea de comando de ejecución
    • y ejecuta hasta ocho procesos a la vez