Ejecutar en paralelo desde bash

Imagen de aasdelat
0 puntos

Hola:

Tengo que usar un programa de cálculo que tarda bastante en realizarlo, y tengo que ejecutarlo sobre unos 17 ficheros, produciendo sendas salidas en sendos ficheros de salida.

Como mi procesador es multinúcleo (4 núleos), quiero poder ejecutar los cálculos en paralelo para que se hagan antes. No es necesario que se ejecuten sólo 4 al mismo tiempo, se pueden ejecutar los 17 al mismo tiempo. Ya el sistema se encarga de repartir el trabajo entre los núcleos.

El asunto es que recibo el mensaje de aviso de que el pid 'forked' ya existe en el trabajo 7, o en el 6.

No sé lo que significa ese aviso ni si es grave.

Además, cuando miro los 17 ficheros de salida generados, no se han escrito bien. No se ha mezclado información de unos con otros, pero no se han guardado todos los datos.

El programa de cálculo es el cdo, que se puede instalar con synaptic.

El script tiene definida una función que es la que se ejecuta 17 veces en paralelo.

La parte principal del script es:

n=0
while [ "$n" -lt "$nFicheros" ] # Los arrays en bash, empiezan por el índice cero.
do
echo "Fichero "${arFicheros[$n]}
$(una_iteracion "${arFicheros[$n]}") & # El ampersant final es para que ejecute en paralelo
n=$((n+1))
done

En cuanto a la función una_iteracion, la defino aproximadamente como:

una_iteracion()
{
local filein
local max
local fechas_y_horas
local n_missing_dentro_mapa
local fileout_individual

filein="$1"

fileout_individual=$fileout"-"$filein".csv"

# Ahora contamos el nº de valores missing en el fichero recortado, para cada paso de tiempo.
fechas_y_horas=$(cdo showtimestamp $filein)
for fecha_y_hora in $fechas_y_horas
do
printf "$filein;" >> $fileout_individual
printf "$fecha_y_hora;" >> $fileout_individual
n_missing=$(cdo outputf,%f,1 -timsum -fldsum -eqc,$sustituto_missing -maskregion,../limites_Uni_ex/LimitesTodaEspañaES.ESP.rgn -maskregion,../evspsbl/region-OURANOS.rgn -setmisstoc,$sustituto_missing -seldate,$fecha_y_hora,$fecha_y_hora $filein 2>/dev/null) # Esta es la orden que hace el cálculo llamando al programa cdo.

printf "$n_missing_dentro_mapa\n" >> $fileout_individual
done
} # fin de la definición de la función una_iteracion

Gracias