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?
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?
Respuestas:
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-parallel
manual para más detalles):
parallel "sortstuff.sh -a {} > {//}/sortedstuff-{/}" <live_hosts
>
con, | tee
por ejemplo, el primer comando se convierte en parallel "sortstuff.sh -a {} | tee sortedstuff-{}" <live_hosts
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 parallel
comando para llamarlo sería:
parallel wrapper.sh < live_hosts
Tenga en cuenta que no necesita cat
este tipo de cosas, lo que ahorra una invocación de programa externo.
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
parallel
sin embargo, facilita la gestión de ciertos aspectos; puede limitar la cantidad de trabajos que se ejecutan en paralelo más fácilmente.
wc -l live_hosts
es 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 parallel
limitar el número de trabajos no solo es agradable, es casi esencial, si la velocidad de procesamiento es su objetivo.
tee
conparallel
al poner la salida ensortedstuff
? Entonces puedo ver la salida a medida que avanza.