Я запускаю сценарий оболочки, который передает данные от одного процесса другому
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, но:
Счетчик байтов выводится на стандартный вывод вместе с любым выводом process_b.
Вы можете использовать префикс для идентификации строки, содержащей байты, при работе с выводом (Bytes:
в примере).
exec 3>&1
process_a | tee >({ echo -n 'Bytes:'; wc -c; } >&3) | process_b
exec 3>&-
ПРЕДУПРЕЖДЕНИЕ:
Не полагайтесь на порядок строк в выводе
Порядок непредсказуем и всегда может отличаться, даже при вызове одного и того же скрипта с одинаковыми параметрами!