Teer mit Fortschrittsbalken und Umgang mit mehreren Volumina

524
Glen Kauffman

Ich versuche, ein Tar eines großen LVM-Volumes auf mehreren externen Laufwerken zu erstellen. Dieser Teil ist gelöst. Nun, da es ein langer Prozess ist, hätte ich gerne einen Fortschrittsbalken. Von den ausgezeichneten Artikeln hier bin ich näher gekommen.

Das Problem ist, dass der PV-Balken nach dem Auffüllen des ersten Volumens beendet wird. Ich möchte, dass PV die Aktualisierung fortsetzt, nachdem die Festplatten ausgetauscht wurden. Hat jemand eine Idee, wie man das angehen soll?

Folgendes habe ich versucht. Ich denke, das Problem liegt in der letzten Codezeile. Ich bin nicht sicher, ob diese Strategie tatsächlich mit mehreren Volumina funktionieren wird.

Code 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 $-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 $ > LVMBackup-$(date +%m-%d-%y)-Vol1.tar 
4

1 Antwort auf die Frage

1
procrastilet

Okay, ich habe einige Zeit gebraucht, um zu verstehen, was tar -Feigentlich geht (ist das überhaupt dokumentiert? Ich habe gerade die Quelle gelesen), aber ich denke, ich habe eine ziemlich gute Lösung für Sie gefunden.

Da pves nicht unterstützt wird, so zu tun, als ob bereits ein gewisser Fortschritt erzielt wurde, musste ich es durch ein ähnliches Werkzeug namens ersetzen bar(das in Debian unter diesem Namen verfügbar ist oder auf seiner abscheulichen Startseite zu finden ist ).

Die Lösung, die ich gefunden habe, leitet die Daten aller zusätzlichen Volumes durch eine Named Pipe (FIFO) weiter, um den barAufruf in den Stream einzufügen. Um zu vermeiden, dass der Fortschrittsbalken jedes Volumes in einer neuen Zeile gedruckt wird, verwende ich 'tput', um den Cursor nach jedem Volume nach oben zu bewegen.

In Ihrem Code würden Sie die letzte Zeile changedisk()durch Folgendes ersetzen . (Dies ist aus Gründen der Kürze etwas hackig; passen Sie es einfach an, sobald Sie die Idee haben)

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

Und ersetzen Sie den pvAufruf in der letzten Zeile Ihres Skripts mit bar -ns --size $.

Damit dies funktioniert, müssen Sie exportvor der SIZE-Definition stehen und natürlich schon einmal ausgeführt mkfifo somefifohaben. Stellen Sie sicher, dass Sie auch die Berechtigungsbits dieses FIFOs sichern. Möglicherweise möchten Sie auch in Betracht ziehen, mktempstattdessen eine temporäre Pipe sicher zu erstellen. Kommt auf dein Szenario an, denke ich.

Ich habe eine noch nicht definierte Variable $VOLSIZEverwendet, die sich in Bytes auf die Größe Ihrer Volumes ausweiten sollte. Ich bin nicht sicher, wie dies in Ihrem Setup bestimmt wird. Möglicherweise müssen Sie hier etwas ausführlicher vorgehen, z. B. die kumulierte Summe aller vorherigen Volumengrößen.