2013-04-03 3 views
1

Existe-t-il un moyen de suivre ou de surveiller les progrès dans les limites de xargs?Suivi de la progression dans xargs

Je remplace une boucle for avec find … | xargs pour les performances (spécifiquement pour exécuter des tâches en parallèle). J'ai lu que parallel a un drapeau de progrès, mais je me demandais s'il y avait un moyen d'accomplir cela strictement en utilisant xargs.

Je suis également conscient que les tâches exécutées en parallèle via xargs ne finiront pas nécessairement dans le bon ordre, ce qui aggrave la complexité du suivi des progrès. Même si une solution me donnait une idée générale des progrès, ce serait un bon début.

+0

progression en termes de nombre de fichiers? – perreal

+0

J'ai l'impression que 'xargs' attire l'attention avec de nouvelles fonctionnalités. un environnement de système d'exploitation/version peut ne pas être vrai dans votre environnement actuel. Avez-vous lu attentivement votre 'man xargs'? Aussi, juste en utilisant un cmd 'ps' correctement construit (encore,' man ps'), pourrait vous donner beaucoup d'indices. Mon système actuel a 'pstee' qui pourrait être utile. Bonne chance! – shellter

+0

Oui, j'aimerais suivre les progrès en termes de nombre de fichiers traités (pourcentage complété). Je cours un grand nombre d'images à travers un processus de compression. Je cours également OS X, qui a installé une version assez limitée de 'xargs'. – joeyhoer

Répondre

0

Vous pouvez utiliser pv pour surveiller le tuyau (non en termes de fichiers bien, car il se trouve dans votre pipe), mais vous auriez à dire pv la taille de la sortie de découverte, qui semble vraiment lourd (voir this answer).

Je recommande vraiment d'utiliser parallel, basé sur ce que vous essayez d'accomplir ... c'est exactement pour quoi il a été conçu. Sinon, si vous avez installé les outils de développement Apple, vous pouvez écrire un petit script qui génère un Makefile pour accomplir la même tâche et s'assurer qu'il imprime la progression comme vous le souhaitez.

3

Si vous voulez juste d'entrer le nombre de lignes que vous à peu près déjà traitée, vous pouvez créer simple fonction shell pour faire

#!/bin/bash 

#----- 
## 
## @function count 
## 
## @desc Write every n'th number (if n is 5 write 5, 10, 15, ...) 
## 
## @param $1 - number 
## 
#----- 
function count { 
    typeset C=0 
    while read L; do 
     C=$((C + 1)) 
     if [ $(($C % $1)) -eq 0 ]; then 
     echo $C 1>&2 
     fi 
     echo "$L" 
    done 
} 

find . | count 100 | xargs ... 

Petit problème est que cette affiche nombre de lignes transmises à xargs, pas le nombre de lignes déjà traité par la commande invoquée par xargs. De plus, chaque tuyau a un peu de tampon, donc il affichera un nombre légèrement supérieur à ce qu'il devrait. Sur ma machine il a montré ~ 500 lignes à l'avance à l'état réel mais si vous traitez un nombre suffisant de lignes 500 est négligeable :)

+0

brillant !!!!!! – mtk

1

Si vous cherchez seulement une indication générale de progrès, la méthode la plus simple est de simplement écho avant de faire la commande que vous aimeriez faire.

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

-I{} ensembles {} à la chaîne en cours de traitement

sh -c vous permettra d'exécuter plusieurs commandes (note: point-virgule après chaque commande est nécessaire , y compris le dernier

Questions connexes