Назад | Перейти на главную страницу

Подсчитать количество байтов, переданных от одного процесса к другому

Я запускаю сценарий оболочки, который передает данные от одного процесса другому

process_a | process_b

Кто-нибудь знает способ узнать, сколько байтов было передано между двумя программами? Единственное решение, которое я могу придумать на данный момент, - это написать небольшую программу на c, которая читает из stdin, записывает в stdout и подсчитывает все переданные данные, сохраняя счетчик в переменной среды, например:

process_a | count_bytes | process_b

У кого-нибудь есть более аккуратное решение?

Использовать pv зритель трубы. Это отличный инструмент. Узнав об этом, вы никогда не узнаете, как жили без него.

Он также может показать вам индикатор выполнения и «скорость» передачи.

Труба через дд. dd по умолчанию вводит stdin, а вывод по умолчанию - stdout; когда он завершит ввод-вывод stdin / stdout, он сообщит stderr о том, сколько данных он передал.

Если вы хотите захватить вывод dd, а другие программы уже взаимодействуют со stderr, используйте другой файловый дескриптор. Например,

$ exec 4>~/fred
$ input-command | dd 2>&4 | output-command
$ exec 4>&-

process_a | tee >(process_b) | wc --bytes может работать. Затем вы можете перенаправить wcотсчет до тех пор, пока он вам не понадобится. Если process_b выводит что-нибудь в stdout/stderr вам, вероятно, нужно будет перенаправить это куда-нибудь, если только /dev/null.

Для немного надуманного примера:

filestore:~# cat document.odt | tee >(dd of=/dev/null 2>/dev/null) | wc --bytes
4295

В качестве пояснения: tee позволяет направлять вывод в несколько файлов (плюс стандартный вывод), а >() конструкция - это «подстановка процесса» в bash, которая в данном случае делает процесс похожим на файл, доступный только для записи, поэтому вы можете перенаправлять как процессы, так и файлы (см. Вот, или этот вопрос + ответ для примера использования tee для отправки вывода во многие процессы).

Я знаю, что опаздываю на вечеринку, но думаю, что у меня есть хороший ответ, который может улучшить эту полезную беседу.
Это смесь ответов @Phil P и @David Spillett, но:

  • в отличие от @Phil P, он избегает создания нового файла
  • в отличие от @David Spillett, он поддерживает структуру конвейера

Счетчик байтов выводится на стандартный вывод вместе с любым выводом process_b.
Вы можете использовать префикс для идентификации строки, содержащей байты, при работе с выводом (Bytes: в примере).

exec 3>&1
process_a | tee >({ echo -n 'Bytes:'; wc -c; } >&3) | process_b
exec 3>&-

ПРЕДУПРЕЖДЕНИЕ:
Не полагайтесь на порядок строк в выводе
Порядок непредсказуем и всегда может отличаться, даже при вызове одного и того же скрипта с одинаковыми параметрами!