Файлы с изменением хвоста

Это своего рода хакерский / необычный ответ, факт в том, что это, скорее всего, возможно не очень чистым способом.


grep , похоже, печатает вывод только тогда, когда он встречает символ новой строки, ваш индикатор выполнения, вероятно, не вводит символ новой строки при обновлении, следовательно, ваша проблема.

strace - это инструмент, используемый для просмотра системных вызовов, вызываемых командой, включая такие вещи, как чтение и запись в память / хранилище, а также такие вещи, как открытие / закрытие файловых дескрипторов.


С помощью strace вы можете видеть, к какому процессу обращается процесс, в случае вашего канала stout передается в grep , поэтому с помощью strace вы можете просмотреть текст, который передается в grep . strace будет регулярно отправлять вывод, поступающий из конвейерной команды, и вы можете прослушать этот вывод и отобразить его. Я тестировал с помощью rsync --progress , что похоже на аналогичный сценарий. Я использовал grep на ##% , потому что это то, что rsync использует для отображения прогресса.

rsync --progress file1 file2 | strace -e trace=read grep "[0-9]*%"

Если вы запустите эту команду, вы обнаружите, что strace не дает хороших результатов, но когда я использовал его strace поймал пару прочитанных ] s из rsync , что grep обычно не записывает , показывая read s для 0%, 21%, 45%, 68 %, 91% и 100%, казалось, обновлялись каждую секунду (вероятно, в зависимости от того, как часто rsync обновляет прогресс).

Таким образом, вы можете grep вывод strace , что не очень хорошо, снова вызвав тот же grep .

rsync --progress file1 file2 | strace -e trace=read grep "[0-9]*%" 2>&1 > /dev/null | grep -o "[0-9]*%"

2> & 1 важен, потому что strace печатается на stderr . > / dev / null перенаправляет stdout на / dev / null , чтобы предотвратить вывод первого сообщения grep . Конечным результатом этого был следующий результат:

0%
21%
45%
68%
91%
100%

Вам придется заменить grep , но похоже, что это поможет. Это некрасиво, но работает и работает в обход ограничений grep . Похоже, grep -f , который работает как tail -f , будет удобен (я знаю, что grep -f уже используется).

Первый grep в основном предназначен для фильтрации текста, который strace будет прочитан , поскольку в будут перечислены только совпадающие строки. ] strace s читает вызовы, но вам также нужно что-то для перемещения текста, чтобы strace мог его смотреть.

2
10.10.2017, 11:43
0 ответов

Теги

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