4

Я пытаюсь создать tar большого тома LVM на нескольких внешних дисках. Эта часть решена. Теперь, потому что это долгий процесс, я бы хотел индикатор выполнения. Из отличных статей здесь я подобрался близко.

Проблема в том, что PV бар закрывается после заполнения первого тома. Я бы хотел, чтобы PV продолжал обновляться после замены дисков. У кого-нибудь есть идеи о том, как к этому подойти?

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

Код ExtBackup.sh:

#!/bin/sh

changedisk()
{
# This routine is called when tar runs out of disk space
# It simply waits for operator to change and mount disks
# then updates the file handle with a new volume number.
echo "Change disks now!" 
read -p "Press <enter> when new disk is mounted. ..." NULL
echo ""

# Update the file name with the new volume number
name=`expr $TAR_ARCHIVE : '\(.*\)-.*'`
echo ${name:-$TAR_ARCHIVE}-Vol$TAR_VOLUME.tar >&$TAR_FD
}

###########
## MAIN  ##
###########

# Test for recursive call to change disks
if [ "$1" = 'changedisk' ]; then 
        changedisk
        exit 0;
fi

# If this is initial call, set SIZE to calculate bytes in source    
SIZE=`du -sb *Folder_Name* | cut -f 1`

# Now TAR it, using Multi-volume option and pipe through PV for progress bar
tar -cM -F 'sh ExtBackup.sh changedisk' *Folder_Name* | \
pv -s ${SIZE} > LVMBackup-$(date +%m-%d-%y)-Vol1.tar

1 ответ1

1

Хорошо, мне потребовалось некоторое время, чтобы понять, что на самом деле делает tar -F (это вообще где-нибудь задокументировано? Я только что закончил читать источник), но я думаю, что нашел довольно хорошее решение для вас.

Поскольку pv не поддерживает притворство, что определенный прогресс уже достигнут, мне нужно было заменить его на аналогичный инструмент под названием bar (доступный в Debian под этим именем или увидеть его отвратительную домашнюю страницу).

Решение, которое я нашел, передает данные всех дополнительных томов через именованный канал (FIFO), чтобы внедрить вызов bar в поток. Чтобы не печатать индикатор выполнения каждого тома в новой строке, я использую «tput» для перемещения курсора вверх после каждого тома.

В вашем коде вы бы заменили последнюю строку в changedisk() на следующую. (Для краткости это немного странно; просто настройте его, как только вы поймете идею)

tput cuu1 >&2 # clear previous progress bar
(cat somefifo | bar -ns \
    --size "$SIZE" \
    --completed $(((${TAR_VOLUME}-1)*${VOLSIZE})) \
    > ${name:-$TAR_ARCHIVE}-Vol$TAR_VOLUME.tar) &
echo somefifo >&$TAR_FD

И замените вызов pv в последней строке вашего скрипта на bar -ns --size ${SIZE} .

Чтобы это работало, вам нужно поставить export перед определением SIZE, и, конечно, в какой-то момент заранее выполнить mkfifo somefifo . Удостоверьтесь, что вы также обезопасили биты разрешений FIFO. Вы также можете рассмотреть возможность использования mktemp для безопасного создания временного канала. Зависит от твоего сценария, наверное.

Я использовал пока неопределенную переменную $VOLSIZE которая должна расширяться до размера ваших томов в байтах. Я не уверен, как это определяется в вашей настройке. Может быть, вам нужно сделать что-то более сложное, например, отслеживать совокупную сумму всех предыдущих размеров тома.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .