Ejecutar script de shell en paralelo
Tengo un script de shell que
- mezcla un archivo de texto grande (6 millones de filas y 6 columnas)
- ordena el archivo según la primera columna
- 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 parallel
aprovechar al máximo las CPU de múltiples núcleos?
En este momento, . /file1.sh
se ejecuta en secuencia de 1 a 1000 ejecuciones y es muy lento.
Gracias por tu ayuda.
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 2
etc., 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í ).
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