Отслеживание прогресса с помощью xargs

11

Я использую xargs для выполнения команды с набором входных параметров примерно так:

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

Входной файл очень длинный и занимает много времени для запуска. Так что я просто жду, пока появится командная строка. Есть ли способ отобразить индикатор выполнения для числа введенных аргументов?

Я пытался использовать «бар», но у меня всегда была «бесконечная» пропускная способность. Кажется, что xargs читает весь ввод перед выполнением команд.

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

Уткарш Синха
источник

Ответы:

13

Если у вас есть GNU Parallel, вы можете запустить:

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

GNU Parallel - это общий параллелизатор, который позволяет легко запускать задания параллельно на одной и той же машине или на нескольких машинах, к которым у вас есть доступ по ssh.

Если у вас есть 32 различных задания, которые вы хотите запустить на 4 процессорах, прямой способ распараллеливания - запустить 8 заданий на каждом процессоре:

Простое планирование

GNU Parallel вместо этого порождает новый процесс после его завершения - поддерживая активные процессоры и, таким образом, экономя время:

Параллельное планирование GNU

Установка

Персональная установка не требует root-доступа. Это можно сделать за 10 секунд, выполнив это:

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

Для других вариантов установки см. Http://git.savannah.gnu.org/cgit/parallel.git/tree/README.

Учить больше

Другие примеры: http://www.gnu.org/software/parallel/man.html

Посмотрите вступительные видеоролики: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Просмотрите руководство: http://www.gnu.org/software/parallel/parallel_tutorial.html.

Зарегистрируйтесь для получения списка поддержки по электронной почте: https://lists.gnu.org/mailman/listinfo/parallel

Оле Танге
источник
1
Большое спасибо (за ответ и за написание программного обеспечения!), он прекрасно работает!
Грег Садецкий
9

Вы можете использовать PV:

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

При этом вы будете знать, где находится чтение someimput , поэтому вы будете приблизительно знать, где находится лечение someimput .

DrGkill
источник
1
Другим частым вариантом использования может быть комбинация с find:FIND=( find "$DIR" -type f ) && ${FIND[@]} -print0 | pv -0lps $(${FIND[@]} | wc -l) | xargs -0 -I {} -P 5 <somecmd>
mxmlnkn
3

Если вам нужен только общий признак прогресса, самый простой способ - просто повторить эхо перед выполнением команды, которую вы хотели бы выполнить.

Пример: cat <someinput> | xargs -I{} sh -c 'echo {}; <somecmd>;'

-I{}устанавливает {}текущую строку, обрабатываемую

sh -cпозволит вам выполнять несколько команд (примечание: точка с запятой после каждой команды, включая последнюю .

Захир
источник