Мониторинг Rsync Progress
Я пытаюсь написать Python script, который будет отслеживать передачу rsync и предоставлять (приблизительную) оценку процентного прогресса. Для моей первой попытки я просмотрел команду rsync --progress
и увидел, что она печатает сообщения, такие как:
1614 100% 1.54MB/s 0:00:00 (xfer#5, to-check=4/10)
Я написал парсер для таких сообщений и использовал часть проверки для получения процентного прогресса, здесь это будет 60% завершено.
Однако в этом есть два недостатка:
- В больших передачах "числитель" фракции проверки не кажется монотонно уменьшающимся, поэтому процентная полнота может скатиться назад.
- Такое сообщение не печатается для всех файлов, что означает, что прогресс может перепрыгнуть вперед.
Я рассмотрел другие варианты использования сообщений, но ничего не нашел. У кого-нибудь есть идеи?
Спасибо заранее!
Ответы
Ответ 1
Текущая версия rsync (на момент редактирования 3.1.2) имеет опцию --info=progress2
, которая покажет вам ход всей передачи вместо отдельных файлов.
От справочная страница:
Существует также опция -info = progress2, которая выводит статистику на основе всей передачи, а не отдельных файлов. Используйте этот флаг без вывода имени файла (например, избегайте -v или укажите -info = name0, если вы хотите увидеть, как выполняется передача, не прокручивая экран с большим количеством имен. (Вам не нужно указывать - для использования --info = progress2.)
Итак, если возможно, в вашей системе вы можете обновить rsync до текущей версии, которая содержит эту опцию.
Ответ 2
Вы можете отключить инкрементную рекурсию с аргументом --no-inc-recursive
. rsync выполнит предварительную проверку всей структуры каталогов, поэтому он знает общее количество файлов, которые он должен проверить.
На самом деле это старый метод, который он рекурсировал. Для скорости добавлена инкрементальная рекурсия, текущее значение по умолчанию.
Ответ 3
Обратите внимание на предостережение здесь, что даже --info=progress2
является не полностью надежным, так как это процент, основанный на количестве файлов, которые rsync знает о том, когда отображается прогресс. Это не обязательно общее количество файлов, которые необходимо синхронизировать (например, если он обнаруживает большое количество больших файлов в глубоко вложенной директории).
Один из способов гарантировать, что --info=progress2
не будет возвращаться в индикацию выполнения, - заставить rsync сканировать все каталоги рекурсивно, прежде чем запускать синхронизацию (вместо того, чтобы по умолчанию выполнять поэтапно рекурсивное сканирование), также предоставляя опцию --no-inc-recursive
. Обратите внимание, однако, что этот параметр также увеличит использование памяти rsync и время выполнения.
Ответ 4
Для полного контроля над передачей вы должны использовать более низкоуровневый инструмент разметки и управлять списком каталогов и передачей данных самостоятельно.
На основе librsync есть либо командная строка rdiff, либо модуль python pysync