Śledzenie postępów za pomocą xargs

11

Korzystam z xargs, aby wykonać polecenie na zestawie parametrów wejściowych mniej więcej tak:

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

Plik wejściowy jest naprawdę długi i jego uruchomienie zajmuje dużo czasu. Czekam więc, aż pojawi się wiersz polecenia. Czy istnieje sposób wyświetlenia paska postępu dla liczby zakończonych argumentów wejściowych?

Próbowałem użyć „bar”, ale zawsze otrzymałem „nieskończoną” przepustowość. Wygląda na to, że xargs odczytuje całe dane wejściowe przed wykonaniem poleceń.

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

Utkarsh Sinha
źródło

Odpowiedzi:

13

Jeśli masz GNU Parallel, możesz uruchomić:

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

GNU Parallel to ogólny paralelizator, który ułatwia równoległe uruchamianie zadań na tej samej maszynie lub na wielu maszynach, do których masz dostęp ssh.

Jeśli masz 32 różne zadania, które chcesz uruchomić na 4 procesorach, prostym sposobem na zrównoleglenie jest uruchomienie 8 zadań na każdym procesorze:

Proste planowanie

Zamiast tego GNU Parallel odradza nowy proces po zakończeniu - utrzymując procesory aktywne, a tym samym oszczędzając czas:

Planowanie równoległe GNU

Instalacja

Instalacja osobista nie wymaga dostępu do konta root. Można to zrobić w 10 sekund, wykonując następujące czynności:

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

Inne opcje instalacji można znaleźć na stronie http://git.savannah.gnu.org/cgit/parallel.git/tree/README

Ucz się więcej

Zobacz więcej przykładów: http://www.gnu.org/software/parallel/man.html

Obejrzyj filmy wprowadzające: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Przejrzyj samouczek: http://www.gnu.org/software/parallel/parallel_tutorial.html

Zarejestruj się, aby uzyskać listę e-mail, aby uzyskać pomoc: https://lists.gnu.org/mailman/listinfo/parallel

Ole Tange
źródło
1
dziękuję bardzo (za odpowiedź i za napisanie oprogramowania!), działa świetnie!
Greg Sadetsky
9

Możesz użyć pv:

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

Dzięki temu będziesz wiedział, gdzie znajduje się odczyt pewnej ilości , więc będziesz wiedział w przybliżeniu, gdzie jest leczenie pewnej ilości .

DrGkill
źródło
1
Innym częstym przypadkiem użycia może być kombinacja z find:FIND=( find "$DIR" -type f ) && ${FIND[@]} -print0 | pv -0lps $(${FIND[@]} | wc -l) | xargs -0 -I {} -P 5 <somecmd>
mxmlnkn
3

Jeśli szukasz tylko ogólnego wskazania postępu, najprostszą metodą jest echo przed wykonaniem polecenia, które chcesz wykonać.

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

-I{}ustawia {}aktualnie przetwarzany ciąg

sh -cpozwoli na wykonanie wielu poleceń (uwaga: średnik po każdym poleceniu jest wymagany, w tym ostatnim .

Zaheer
źródło