Вопрос или проблема
Предположим, у меня есть серверA с блочным устройством, содержимое которого я хочу перенести на блочное устройство сервераB через компьютер, на котором я работаю, в качестве реле. Это очень удобно с помощью пайпов, буферов, dd и подобных инструментов.
Чтобы отслеживать прогресс и выявлять узкие места, мне нравится следить за выводом статуса каждого отдельного команды.
Кроме того, чтобы усложнять эту однострочную команду, открывая несколько терминалов, отправляя процессы в фоновый режим (&), прокручивая вывода через FIFO или подобные вещи, есть ли способ удобно сортировать выводы статуса?
ssh serverA "sudo dd if=/dev/sdc status=progress | mbuffer" | mbuffer | ssh serverB "mbuffer | sudo dd of=/dev/sdc status=progress"
Это дает мне одну строку, которая быстро переключается между статусами пяти различных команд и также не очищает строку между ними. Например, чередование между следующими (обратите внимание на ‘00% заполнено’ в альтернативном выводе):
in @ 6137 kiB/s, out @ 6137 kiB/s, 26.3 GiB total, buffer 100% full
30353129472 bytes (30 GB, 28 GiB) copied, 1158 s, 26.2 MB/s00% full
Аккуратный вывод должен сохранять вывод каждой команды постоянно на отдельной строке.
pv
можно использовать для отображения текущей пропускной способности в конвейере и также выполнять то же, что и mbuffer
с его опцией -B
(и также может в реальном времени сообщать, насколько полон буфер).
У него также есть режим с ограничением скорости (-qL
), который вы можете использовать для имитации медленных читателей для тестирования.
ssh srchost 'sudo pv -cB1G -F "from device:%t: [%b] %r (buffer: %T)" /dev/sdc' |
pv -WcB1G -F "through pipe:%t: [%b] %r (buffer: %T)" |
ssh dsthost 'sudo sh -c '\''
pv -WcB1G -F "received by dst:%t: [%b] %r (buffer: %T)" > /dev/sdc'\'
Использовать dd
здесь не имеет смысла.
Ответ или решение
Да, существует удобный способ отслеживать состояние выполнения нескольких пайп-команд, не прибегая к усложнению однострочного выражения. Вы правильно отметили возможность использования pv
(Pipe Viewer) для мониторинга прогресса передачи данных в пайпах. Это позволит вам получать статус каждого этапа в отдельной строке.
Для вашего случая, где вы перемещаете содержимое блочного устройства с одного сервера на другой через промежуточный компьютер, можно использовать следующую команду:
ssh serverA 'sudo pv -cB1G -F "from device:%t: [%b] %r (buffer: %T)" /dev/sdc' | \
pv -WcB1G -F "through pipe:%t: [%b] %r (buffer: %T)" | \
ssh serverB 'sudo pv -WcB1G -F "received by dst:%t: [%b] %r (buffer: %T)" > /dev/sdc'
Эта команда использует pv
для отслеживания состояния на каждом шаге:
-
На сервере A: Используется
pv
с опцией-cB1G
, которая позволяет отображать статус передачи с учетом размера буфера в 1 ГБ.%t
– это метка времени,%b
– это текущий буфер, а%r
– это скорость передачи данных. Это позволяет вам видеть скорость и статус передачи данных с устройства/dev/sdc
на сервере A. -
На промежуточном компьютере (ваша машина): Второй
pv
принимает входящий поток и также отображает скорость и статус передачи. Опция-W
заставляетpv
ожидать завершения передачи. -
На сервере B: Этот
pv
принимает данные из промежуточного компьютера и записывает их на/dev/sdc
, показывая статус загрузки на сервере B.
Каждая команда будет выводить свой статус на отдельной строке, что упростит чтение и мониторинг статуса передачи.
В результате вы получите удобное и читабельное отображение данных, обеспечивая ясную картину происходящего на каждом этапе процесса передачи данных.