Seguimiento del progreso con xargs

11

Estoy usando xargs para ejecutar un comando en un conjunto de parámetros de entrada algo como esto:

cat <someinput> | xargs -n 1 -P 5 <somecmd>

El archivo de entrada es realmente largo y tarda mucho en ejecutarse. Así que solo estoy esperando que aparezca el símbolo del sistema. ¿Hay alguna manera de mostrar una barra de progreso para el número de argumentos de entrada que se han completado?

Intenté usar 'bar' pero siempre obtuve un rendimiento 'infinito'. Parece que xargs lee toda la entrada antes de ejecutar comandos.

http://i.stack.imgur.com/5Wsgx.gif

Utkarsh Sinha
fuente

Respuestas:

13

Si tiene GNU Parallel puede ejecutar:

cat <someinput> | parallel --bar -P 5 <somecmd>

GNU Parallel es un paralelizador general y hace que sea fácil ejecutar trabajos en paralelo en la misma máquina o en varias máquinas a las que tiene acceso ssh.

Si tiene 32 trabajos diferentes que desea ejecutar en 4 CPU, una forma directa de paralelizar es ejecutar 8 trabajos en cada CPU:

Programación simple

GNU Parallel genera un nuevo proceso cuando uno termina, manteniendo las CPU activas y ahorrando tiempo:

Programación paralela de GNU

Instalación

Una instalación personal no requiere acceso de root. Se puede hacer en 10 segundos haciendo esto:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

Para otras opciones de instalación, consulte http://git.savannah.gnu.org/cgit/parallel.git/tree/README

Aprende más

Ver más ejemplos: http://www.gnu.org/software/parallel/man.html

Mira los videos de introducción: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Recorre el tutorial: http://www.gnu.org/software/parallel/parallel_tutorial.html

Regístrese en la lista de correo electrónico para obtener asistencia: https://lists.gnu.org/mailman/listinfo/parallel

Ole Tange
fuente
1
muchas gracias (por la respuesta y por escribir el software), ¡funciona muy bien!
Greg Sadetsky
9

Puedes usar pv:

cat <someinput> | pv -p -s sizeof_someimput | xargs -n 1 -P 5 <somecmd>

Con esto sabrá dónde está la lectura de alguna entrada , de modo que sabrá aproximadamente dónde está el tratamiento de alguna entrada .

DrGkill
fuente
1
Otro caso de uso frecuente podría ser la combinación con find:FIND=( find "$DIR" -type f ) && ${FIND[@]} -print0 | pv -0lps $(${FIND[@]} | wc -l) | xargs -0 -I {} -P 5 <somecmd>
mxmlnkn
3

Si está buscando solo una indicación general de progreso, el método más simple es hacer eco antes de hacer el comando que le gustaría hacer.

Ejemplo: cat <someinput> | xargs -I{} sh -c 'echo {}; <somecmd>;'

-I{}se establece {}en la cadena actual que se está procesando

sh -cle permitirá ejecutar múltiples comandos (nota: punto y coma después de que se requiera cada comando, incluido el último) .

Zaheer
fuente