Я часто копирую много файлов между двумя серверами, подключенными через Ethernet на 1 Гбит, пока я подключен через VPN и SSH через DSL. Проблема в том, что подробный вывод (1 строка на скопированный файл), который необходимо отправить через медленное соединение с моим ssh-клиентом, замедляет операцию копирования (мне так кажется)
Я тестировал это с помощью тестового файла, созданного через
dd if=/dev/urandom | base64 | dd of=testfile count=10M bs=1
Тестовый прогон A (нет вывода)
# time sh -c 'cat testfile > /dev/null'
sh -c 'cat testfile > /dev/null' 0.00s user 0.02s system 97% cpu 0.025 total
Тестовый запуск B (весь вывод через ssh / vpn)
# time sh -c 'cat testfile'
sh -c 'cat testfile' 0.00s user 0.45s system 0% cpu 4:31.10 total
(Я знаю, это плохой тест, но он демонстрирует проблему)
Есть ли способ не замедлять работу и получать вывод асинхронно. Я представил себе что-то вроде отбрасывания всех строк, кроме указанного числа в секунду, или что-то вроде этого.
На данный момент я запускаю экран и отключаюсь, пока выполняется операция.
Я использую шпатлевку для окон и openssh-client для доступа к Linux
Любые идеи?
Вы не говорите, что используете для копирования, но, полагаю, это не имеет значения.
Вы можете попробовать что-то подобное, используя pv
:
your-copy-command 2>&1 | tee progress.out | pv -trlb >/dev/null
Это дает вам индикатор прогресса с низкими накладными расходами:
502 0:00:20 [25.1/s ]
который показывает количество строк имена файлов (а не содержимое файла), которое вы бы видели в противном случае. В tee
команда сохраняет этот вывод в удаленной системе на случай, если вам нужно его увидеть. Затем вывод отбрасывается.
Вот способ сделать что-то подобное без pv
your-copy-command 2>&1 | tee progress.out | progress >/dev/null
где progress
это скрипт вроде:
#!/bin/bash
SECONDS=0 # auto update variable
while read -r line
do
if ((count++ % 10 == 9))
then
printf "%s sec, %s lines\r" $SECONDS $count >&2
fi
echo "$line"
done
Если я правильно понимаю, похоже, вы замедляетесь из-за буферизации терминала!
Вам нужно увидеть вывод перевода? Если нет, используйте -q
или соответствующие параметры, чтобы отключить вывод передачи файлов. Если вам нужны эти данные, перенаправьте вывод в файл для последующего просмотра. Тогда ты мог бы tail -f
этот файл.
что произойдет, если вы направите вывод в less?, как в cp a b | Меньше