Ejecutar script de shell en paralelo

Resuelto Tony asked hace 13 años • 9 respuestas

Tengo un script de shell que

  1. mezcla un archivo de texto grande (6 millones de filas y 6 columnas)
  2. ordena el archivo según la primera columna
  3. genera 1000 archivos

Entonces el pseudocódigo se ve así

file1.sh 

#!/bin/bash
for i in $(seq 1 1000)
do

  Generating random numbers here , sorting  and outputting to file$i.txt  

done

¿Hay alguna manera de ejecutar este script de shell para parallelaprovechar al máximo las CPU de múltiples núcleos?

En este momento, . /file1.shse ejecuta en secuencia de 1 a 1000 ejecuciones y es muy lento.

Gracias por tu ayuda.

Tony avatar Apr 05 '11 12:04 Tony
Aceptado

Otra forma muy útil de hacer esto es con gnu paralelo , que vale la pena instalar si aún no lo tienes; Esto es invaluable si las tareas no necesariamente toman la misma cantidad de tiempo.

seq 1000 | parallel -j 8 --workdir $PWD ./myrun {}

iniciará ./myrun 1, ./myrun 2etc., asegurándose de que se estén ejecutando 8 trabajos a la vez. También puede tomar listas de nodos si desea ejecutar varios nodos a la vez, por ejemplo, en un trabajo PBS; Nuestras instrucciones para nuestros usuarios sobre cómo hacerlo en nuestro sistema están aquí .

Actualizado para agregar: desea asegurarse de que está utilizando gnu-parallel, no la utilidad más limitada del mismo nombre que viene en el paquete moreutils (la historia divergente de los dos se describe aquí ).

Jonathan Dursi avatar Apr 05 '2011 12:04 Jonathan Dursi

Consulte las subcapas de bash , que se pueden utilizar para ejecutar partes de un script en paralelo.

No lo he probado, pero podría ser un comienzo:

#!/bin/bash
for i in $(seq 1 1000)
do
   ( Generating random numbers here , sorting  and outputting to file$i.txt ) &
   if (( $i % 10 == 0 )); then wait; fi # Limit to 10 concurrent subshells.
done
wait
Anders Lindahl avatar Apr 05 '2011 06:04 Anders Lindahl