Відстеження прогресу за допомогою xargs


11

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

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

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

Я спробував використовувати "бар", але завжди отримував "нескінченну" пропускну здатність. Здається, що xargs зчитує весь вхід перед виконанням команд.

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

Відповіді:


13

Якщо у вас є паралель GNU, ви можете запустити:

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

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

Якщо у вас є 32 різні завдання, які ви хочете виконати на 4 процесорах, прямим способом паралелізації є виконання 8 завдань на кожному процесорі:

Просте планування

GNU Parallel натомість породжує новий процес, коли закінчується - підтримуючи активні процесори та заощаджуючи час:

Паралельне планування GNU

Установка

Особиста установка не вимагає доступу до кореня. Це можна зробити за 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>

З цим ви дізнаєтесь, де читається деякий вхід , тож ви приблизно дізнаєтесь, де трактується деякий вхід .


1
Ще одним частим випадком використання може стати поєднання з знахідкою: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дозволить вам виконати кілька команд (зверніть увагу: після кожної команди, включаючи останню, потрібно використовувати крапку з комою) .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.