2010-07-23 13 views
11

Estoy tratando de usar xargs en un script de shell para ejecutar instancias paralelas de una función que he definido en el mismo script. La función multiplica la búsqueda de una página, por lo que es importante que las páginas se obtengan de forma simultánea en procesos paralelos y no en procesos en segundo plano (si mi comprensión de esto es incorrecta y hay una diferencia insignificante entre ambas, házmelo saber) .Creación de scripts en shell: uso de xargs para ejecutar instancias paralelas de una función de shell

La función es:

function time_a_url() 
{ 
    oneurltime=$($time_command -p wget -p $1 -O /dev/null 2>&1 1>/dev/null | grep real | cut -d" " -f2) 
    echo "Fetching $1 took $oneurltime seconds." 
} 

¿Cómo se hace esto con un tubo de xargs en una forma que puede tomar varias veces para ejecutar time_a_url en paralelo como un argumento? Y sí, sé sobre GNU paralelo, simplemente no tengo el privilegio de instalar el software donde estoy escribiendo esto.

Respuesta

11

He aquí una demostración de cómo puede ser capaz de obtener su función para trabajar:

$ f() { echo "[[email protected]]"; } 
$ export -f f 
$ echo -e "b 1\nc 2\nd 3 4" | xargs -P 0 -n 1 -I{} bash -c f\ \{\} 
[b 1] 
[d 3 4] 
[c 2] 

las claves para hacer este trabajo son a export la función por lo que los bash que xargs desova verán y escapar el espacio entre el nombre de la función y las llaves escapadas. Debería poder adaptar esto para trabajar en su situación. Tendrá que ajustar los argumentos para -P y -n (o eliminarlos) para satisfacer sus necesidades.

Probablemente puede deshacerse de grep y cut. Si está utilizando Bash incorporado time, puede especificar un formato de salida utilizando la variable TIMEFORMAT. Si está usando GNU /usr/bin/time, puede usar el argumento --format. Cualquiera de estos le permitirá soltar el -p también.

Puede reemplazar esta parte de su wget comando: 2>&1 1>/dev/null con -q. En cualquier caso, los tienes invertidos. El orden correcto sería >/dev/null 2>&1.

+1

Solía ​​'xargs -P0 n1} {-I fiesta -c "f {}"' que todavía funciona, y parece una un poco más ordenado. –

0

Si instala GNU Parallel en otro sistema, verá que la funcionalidad está en un solo archivo (llamado paralelo).

Debería poder simplemente copiar ese archivo a su propio ~/bin.

1

En Mac OS X:

xargs: max. procesos deben ser> 0 (para: xargs -P [> 0])

f() { echo "[[email protected]]"; } 
export -f f 

echo -e "b 1\nc 2\nd 3 4" | sed 's/ /\\ /g' | xargs -P 10 -n 1 -I{} bash -c f\ \{\} 

echo -e "b 1\nc 2\nd 3 4" | xargs -P 10 -I '{}' bash -c 'f "[email protected]"' arg0 '{}' 
Cuestiones relacionadas