Как отобразить индикатор прогресса на экране, основываясь на данных программы?

Я сделал вычисление с использованием CUDA, и для завершения всего вычисления требуется около 12 минут. Я использую эту команду в файле .sh для запуска программы:

CUDA_VISIBLE_DEVICES=0 ./a1.out | tee -a output.txt & CUDA_VISIBLE_DEVICES=1 ./a2.out | tee -a output.txt & CUDA_VISIBLE_DEVICES=2 ./a3.out | tee -a output.txt & CUDA_VISIBLE_DEVICES=3 ./a4.out | tee -a output.txt & CUDA_VISIBLE_DEVICES=4 ./a5.out | tee -a output.txt & CUDA_VISIBLE_DEVICES=5 ./a6.out | tee -a output.txt &

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

0
задан 17 July 2017 в 11:01

3 ответа

Используйте pv(1) в линейном режиме:

COMMAND | pv --line-mode --size 1000 >> output.txt

или короче

COMMAND | pv -ls 1000 >> output.txt

-s / --size задает количество ожидаемых выходных блоков (байты на по умолчанию или строки в линейном режиме).

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

{ COMMAND1 & COMMAND2 & COMMAND3; } | pv -ls 1000 >> output.txt
[d5 ] В этом случае вам нужно указать количество ожидаемых единиц вывода для всех команд в целом.

Демо

for i in {1..200}; do sleep 0.1; echo "$i"; done | pv -ls 200 > /dev/null
3
ответ дан 22 May 2018 в 20:38
  • 1
    Это хороший пример. Но это не сработало с моей командой. Я думаю, что это работает только при печати вывода в текстовом файле через скрипт оболочки. Здесь мой код написан на языке CUDA, а a.out - это исполняемый файл, и я печатаю вывод этого файла в текстовый файл. У вас есть решение для этой ситуации? – agangwal 13 July 2017 в 07:34
  • 2
    @agangwal: Не могли бы вы отредактировать свой вопрос, чтобы включить то, что точно вы сделали и что произошло? Если пример вашего вопроса работает, это означает, что программы записывают свой вывод в стандартный дескриптор выходного файла, который может быть передан в другую программу, например tee или pv. Также не имеет значения, является ли исходный конец канала заказной программой или сценарием оболочки, поскольку оба производят последовательность байтов и записывают их в дескриптор файла. – David Foerster 13 July 2017 в 11:44
  • 3
    Я получаю это сейчас. Я не печатал свой вывод на stdout. Я печатал его в файле, который вызывает проблему с использованием команды pv. – agangwal 13 July 2017 в 11:59

Используйте pv(1) в линейном режиме:

COMMAND | pv --line-mode --size 1000 >> output.txt

или короче

COMMAND | pv -ls 1000 >> output.txt

-s / --size задает количество ожидаемых выходных блоков (байты на по умолчанию или строки в линейном режиме).

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

{ COMMAND1 & COMMAND2 & COMMAND3; } | pv -ls 1000 >> output.txt

В этом случае вам нужно указать количество ожидаемых единиц вывода для всех команд в целом.

Демо

for i in {1..200}; do sleep 0.1; echo "$i"; done | pv -ls 200 > /dev/null
3
ответ дан 18 July 2018 в 10:24

Используйте pv(1) в линейном режиме:

COMMAND | pv --line-mode --size 1000 >> output.txt

или короче

COMMAND | pv -ls 1000 >> output.txt

-s / --size задает количество ожидаемых выходных блоков (байты на по умолчанию или строки в линейном режиме).

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

{ COMMAND1 & COMMAND2 & COMMAND3; } | pv -ls 1000 >> output.txt

В этом случае вам нужно указать количество ожидаемых единиц вывода для всех команд в целом.

Демо

for i in {1..200}; do sleep 0.1; echo "$i"; done | pv -ls 200 > /dev/null
3
ответ дан 24 July 2018 в 19:34

Другие вопросы по тегам:

Похожие вопросы: