¿Cómo usaría GNU Parallel para este ciclo while?

12

Entonces tengo un ciclo while:

cat live_hosts | while read host; do \
    sortstuff.sh -a "$host" > sortedstuff-"$host"; done

Pero esto puede llevar mucho tiempo. ¿Cómo usaría GNU Parallel para este ciclo while?

Proletariado
fuente

Respuestas:

13

No usas un bucle while.

parallel "sortstuff.sh -a {} > sortedstuff-{}" <live_hosts

Tenga en cuenta que esto no funcionará si tiene rutas en su live_hosts(p /some/dir/file. Ej. ), Ya que se expandiría a sortstuff.sh -a /some/dir/file > sortedstuff-/some/dir/file(resultando en no such file or directory); para esos casos use {//}y {/}(vea el gnu-parallelmanual para más detalles):

parallel "sortstuff.sh -a {} > {//}/sortedstuff-{/}" <live_hosts
don_crissti
fuente
¿Es posible usar teecon parallelal poner la salida en sortedstuff? Entonces puedo ver la salida a medida que avanza.
Proletariado
1
@Proletariado: ¿también desea enviar a la terminal? Simplemente reemplace >con, | teepor ejemplo, el primer comando se convierte en parallel "sortstuff.sh -a {} | tee sortedstuff-{}" <live_hosts
don_crissti
3

Como un tipo de Unix de la vieja escuela "haz una cosa y hazlo bien", pondría las cosas de sustitución de cadenas en un script de envoltura:

#!/bin/sh
sortstuff.sh -a "$1" > sortedstuff-"$1"

Si lo llama wrapper.sh, el parallelcomando para llamarlo sería:

parallel wrapper.sh < live_hosts

Tenga en cuenta que no necesita cateste tipo de cosas, lo que ahorra una invocación de programa externo.

Warren Young
fuente
2

No es necesario parallel , ya que el cuerpo del bucle no depende de las iteraciones anteriores. Simplemente inicie un nuevo proceso en segundo plano para cada host.

while read host; do
    sortstuff.sh -a "$host" > sortedstuff-"$host" &
done < live_hosts
wait    # Optional, to block until the background tasks are done

parallelsin embargo, facilita la gestión de ciertos aspectos; puede limitar la cantidad de trabajos que se ejecutan en paralelo más fácilmente.

chepner
fuente
3
Si wc -l live_hostses mayor que el número de ejes de disco o núcleos de CPU, dependiendo de si la tarea es de E / S o vinculada a la CPU, va a comer mucha de la ventaja que obtiene del paralelismo con una solución como esa. La capacidad de parallellimitar el número de trabajos no solo es agradable, es casi esencial, si la velocidad de procesamiento es su objetivo.
Warren Young