Я пишу сценарий bash для периодической передачи данных в удаленную систему. У меня есть локальная команда, которая генерирует поток, и удаленная команда, которая его использует, поэтому я делаю что-то вроде этого:
generate_data | ssh remoteserver.example.com consume_data
(Там, где у меня настроены ssh-ключи, так что я могу делать это не в интерактивном режиме.) Это отлично работает. Однако, поскольку это будет автоматизированный процесс (работающий как задание cron), и иногда он может передавать большие объемы данных с ограниченной пропускной способностью, я хотел бы иметь возможность размещать периодические обновления прогресса в моем файле журнала. Я думал использовать для этого pv
(просмотрщик каналов), и это лучшее, что я мог придумать:
generate_data | pv -fb | ssh remoteserver.example.com consume_data
Опять же, это работает ... , но pv действительно был написан с учетом вывода терминала, поэтому я в конечном итоге запутался в журнале, который выглядит как
2.06MB^M2.19MB^M2.37MB^M 2.5MB^M2.62MB^M2.87MB^M3MB^M3.12MB^M3.37MB
Я бы предпочел сообщения в журнале по строкам
<timestamp> 2.04MB transferred...
<timestamp> 3.08MB transferred...
Если у кого-нибудь есть какие-нибудь умные идеи о том, как это сделать, либо с аргументами, отличными от pv
, либо с помощью другого механизма, я был бы признателен.
РЕДАКТИРОВАТЬ: Спасибо за ответы до сих пор. Конечно, есть много возможных решений домашнего приготовления; Я надеялся найти что-то, что будет работать "из коробки". (Не то чтобы я исключил домашнее варенье; в конце концов, это может быть самой простой вещью. Поскольку pv
уже делает 98% того, что мне нужно, я бы предпочел не изобретать это заново.)
PostScript: Вот строка, которую я в конечном итоге использовал, в надежде, что в какой-то момент это может кому-то помочь.
{ generate_data | pv -fbt -i 60 2>&3 | ssh remoteserver consume_data } 3>&1 | awk -vRS='\r' '{print $1 " transferred in " $2; fflush();}' >> logfile