Я использую xargs для выполнения команды для набора входных параметров примерно так:
cat <someinput> | xargs -n 1 -P 5 <somecmd>
Входной файл очень длинный и долго запускается. Так что я просто жду появления командной строки. Есть ли способ отобразить индикатор выполнения для числа завершенных входных аргументов?
Я пробовал использовать «бар», но всегда получал «бесконечную» пропускную способность. Похоже, что xargs читает весь ввод перед выполнением команд.
Если у вас есть GNU Parallel, вы можете запустить:
cat <someinput> | parallel --bar -P 5 <somecmd>
GNU Parallel - это общий распараллеливатель, который упрощает параллельное выполнение заданий на одной или нескольких машинах, к которым у вас есть доступ по ssh.
Если у вас есть 32 разных задания, которые вы хотите запустить на 4 ЦП, простой способ распараллеливания - запустить 8 заданий на каждом ЦП:
GNU Parallel вместо этого порождает новый процесс, когда один из них завершается, сохраняя активными процессоры и тем самым экономя время:
Монтаж
Персональная установка не требует 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
Вы можете использовать pv:
cat <someinput> | pv -p -s sizeof_someimput | xargs -n 1 -P 5 <somecmd>
С этим вы узнаете, где чтение некоторая импликация есть, так что вы будете примерно знать, где лечение некоторая импликация является.
Если вы ищете только общую индикацию прогресса, самый простой способ - просто повторить эхо перед выполнением команды, которую вы хотите выполнить.
Пример: cat <someinput> | xargs -I{} sh -c 'echo {}; <somecmd>;'
-I{}
наборы {}
к текущей обрабатываемой строке
sh -c
позволит вам выполнять несколько команд (примечание: точка с запятой после каждой команды требуется включая последний.