Tracciare i progressi con xargs


11

Sto usando xargs per eseguire un comando su una serie di parametri di input qualcosa del genere:

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

Il file di input è molto lungo e richiede molto tempo per l'esecuzione. Quindi sto solo aspettando che venga visualizzato il prompt dei comandi. C'è un modo per visualizzare una barra di avanzamento per il numero di argomenti di input che sono stati completati?

Ho provato a usare 'bar' ma ho sempre ottenuto un throughput 'infinito'. Sembra che xargs legga l'intero input prima di eseguire i comandi.

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

Risposte:


13

Se hai GNU Parallel puoi eseguire:

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

GNU Parallel è un parallelizzatore generale e semplifica l'esecuzione di lavori in parallelo sulla stessa macchina o su più macchine a cui hai accesso ssh.

Se hai 32 lavori diversi che vuoi eseguire su 4 CPU, un modo semplice per parallelizzare è quello di eseguire 8 lavori su ogni CPU:

Pianificazione semplice

GNU Parallel invece genera un nuovo processo al termine - mantenendo attive le CPU e risparmiando tempo:

GNU Programmazione parallela

Installazione

Un'installazione personale non richiede l'accesso come root. Puoi farlo in 10 secondi facendo questo:

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

Per altre opzioni di installazione consultare http://git.savannah.gnu.org/cgit/parallel.git/tree/README

Per saperne di più

Vedi altri esempi: http://www.gnu.org/software/parallel/man.html

Guarda i video introduttivi: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Segui il tutorial: http://www.gnu.org/software/parallel/parallel_tutorial.html

Iscriviti alla lista e-mail per ottenere supporto: https://lists.gnu.org/mailman/listinfo/parallel


1
grazie mille (per la risposta e per aver scritto il software!), funziona benissimo!
Greg Sadetsky,

9

Puoi usare pv:

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

Con questo saprai dove si trova la lettura di someimput , quindi saprai approssimativamente dove si trova il trattamento di someimput .


1
Un altro caso d'uso frequente potrebbe essere la combinazione con find:FIND=( find "$DIR" -type f ) && ${FIND[@]} -print0 | pv -0lps $(${FIND[@]} | wc -l) | xargs -0 -I {} -P 5 <somecmd>
mxmlnkn

3

Se stai cercando solo un'indicazione generale di progresso, il metodo più semplice è quello di fare eco prima di eseguire il comando che desideri fare.

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

-I{}imposta {}la stringa corrente in elaborazione

sh -cti permetterà di eseguire più comandi (nota: punto e virgola dopo ogni comando è necessario incluso l'ultimo .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.