Существует ли удобный способ отслеживать статус вывода нескольких связанных команд?

Вопрос или проблема

Предположим, у меня есть сервер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 для отслеживания состояния на каждом шаге:

  1. На сервере A: Используется pv с опцией -cB1G, которая позволяет отображать статус передачи с учетом размера буфера в 1 ГБ. %t – это метка времени, %b – это текущий буфер, а %r – это скорость передачи данных. Это позволяет вам видеть скорость и статус передачи данных с устройства /dev/sdc на сервере A.

  2. На промежуточном компьютере (ваша машина): Второй pv принимает входящий поток и также отображает скорость и статус передачи. Опция -W заставляет pv ожидать завершения передачи.

  3. На сервере B: Этот pv принимает данные из промежуточного компьютера и записывает их на /dev/sdc, показывая статус загрузки на сервере B.

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

В результате вы получите удобное и читабельное отображение данных, обеспечивая ясную картину происходящего на каждом этапе процесса передачи данных.

Оцените материал
Добавить комментарий

Капча загружается...