Suivi des progrès avec xargs

11

J'utilise xargs pour exécuter une commande sur un ensemble de paramètres d'entrée quelque chose comme ceci:

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

Le fichier d'entrée est vraiment long et prend beaucoup de temps à s'exécuter. J'attends donc que l'invite de commande apparaisse. Existe-t-il un moyen d'afficher une barre de progression pour le nombre d'arguments d'entrée terminés?

J'ai essayé d'utiliser «bar» mais j'ai toujours eu un débit «infini». Il semble que xargs lit l'intégralité de l'entrée avant d'exécuter des commandes.

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

Utkarsh Sinha
la source

Réponses:

13

Si vous avez GNU Parallel, vous pouvez exécuter:

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

GNU Parallel est un paralléliseur général et permet d'exécuter facilement des travaux en parallèle sur la même machine ou sur plusieurs machines auxquelles vous avez accès ssh.

Si vous souhaitez exécuter 32 tâches différentes sur 4 processeurs, une manière simple de paralléliser consiste à exécuter 8 tâches sur chaque processeur:

Planification simple

GNU Parallel génère à la place un nouveau processus à la fin - en maintenant les CPU actifs et en économisant ainsi du temps:

Planification parallèle GNU

Installation

Une installation personnelle ne nécessite pas d'accès root. Cela peut être fait en 10 secondes en procédant comme suit:

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

Pour d'autres options d'installation, voir http://git.savannah.gnu.org/cgit/parallel.git/tree/README

Apprendre encore plus

Voir plus d'exemples: http://www.gnu.org/software/parallel/man.html

Regardez les vidéos d'introduction: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Parcourez le didacticiel: http://www.gnu.org/software/parallel/parallel_tutorial.html

Inscrivez-vous à la liste de diffusion pour obtenir de l'aide: https://lists.gnu.org/mailman/listinfo/parallel

Ole Tange
la source
1
merci beaucoup (pour la réponse, et pour avoir écrit le logiciel!), ça marche très bien!
Greg Sadetsky
9

Vous pouvez utiliser pv:

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

Avec cela, vous saurez où se trouve la lecture de certains entrées , vous saurez donc approximativement où se trouve le traitement de certaines entrées .

DrGkill
la source
1
Un autre cas d'utilisation fréquent pourrait être la combinaison avec find:FIND=( find "$DIR" -type f ) && ${FIND[@]} -print0 | pv -0lps $(${FIND[@]} | wc -l) | xargs -0 -I {} -P 5 <somecmd>
mxmlnkn
3

Si vous cherchez juste une indication générale des progrès, la méthode la plus simple consiste à simplement faire écho avant de faire la commande que vous souhaitez faire.

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

-I{}définit {}la chaîne en cours de traitement

sh -cvous permettra d'exécuter plusieurs commandes (note: point-virgule après chaque commande est requise, y compris la dernière .

Zaheer
la source