So überwachen Sie den Fortschritt von Linux-Befehlen (mit pv und progress)

Statt einfach im Dunkeln zu tappen, können Sie mit den Linux-Befehlen `pv` und `progress` den Fortschritt Ihrer Befehle in Echtzeit verfolgen. Diese praktischen Werkzeuge liefern Ihnen Fortschrittsbalken für Prozesse, die standardmäßig keine haben, und zeigen sogar eine voraussichtliche Endzeit an.

Stellen Sie sich vor, Sie sind auf einem Langstreckenflug in einer Maschine ohne Bildschirme in den Sitzen. Es ist schwer zu sagen, wie weit Sie schon geflogen sind. Sie wissen, wann der Start war und wie lange der Flug dauern soll, aber sind Sie im Zeitplan? Oftmals kann man die Flugzeugposition auf einer Karte anzeigen lassen, die auch eine voraussichtliche Ankunftszeit (ETA) beinhaltet.

Die Ausführung von Befehlen im Terminal kann sich manchmal wie ein solcher Flug ohne Bildschirm anfühlen. Man hat keine Ahnung, ob alles normal läuft, ob der Prozess hängt oder wie weit er schon fortgeschritten ist. Ein blinkender Cursor ist nicht gerade informativ.

Hier kommen die Befehle `pv` und `progress` ins Spiel. Sie geben Ihnen nützliche Informationen und visuelles Feedback, sodass Sie sehen können, wie weit ein Prozess ist und wann er voraussichtlich fertig sein wird. Das ist allemal besser als auf einen Cursor zu starren.

Installation von `pv`

Zunächst müssen Sie `pv` installieren.

Unter Ubuntu installieren Sie `pv` mit diesem Befehl:

sudo apt-get install pv

Unter Fedora verwenden Sie diesen Befehl:

sudo dnf install pv

Für Manjaro verwenden Sie:

sudo pacman -Syu pv

Die Verwendung von `pv`

`pv` steht für „Pipe Viewer“. Es muss in eine Befehlskette mit Pipes eingebunden werden. Hier ist ein Beispiel, bei dem wir ein ISO-Image durch eine ZIP-Datei leiten, um ein komprimiertes ZIP-Archiv des ISO zu erstellen.

Um die Befehle etwas zu verlangsamen und Screenshots zu ermöglichen, wurden einige der Beispieldateien auf einem langsamen externen USB-Stick namens SILVERXHD gespeichert.

pv /media/dave/SILVERXHD/gparted-live-1.0.0-1-amd64.iso | zip > gparted.zip

Die von `pv` bereitgestellten Informationen werden in der unteren Zeile des Terminals angezeigt.

Von links nach rechts sehen Sie:

Die bisher übertragene Datenmenge.
Die vergangene Zeit.
Die Datenübertragungsrate (Durchsatz).
Einen Fortschrittsbalken und den Prozentsatz der Fertigstellung.
Die geschätzte Restzeit (ETA).

Dateien mit `pv` kopieren

Um eine Datei mit `pv`-Ausgabe zu kopieren, verwenden Sie diesen Befehl:

pv /media/dave/SILVERXHD/gparted-live-1.0.0-1-amd64.iso > gparted.iso

Sie erhalten einen Fortschrittsbericht, während die Datei kopiert wird.

Mehrere Dateien mit `pv` kopieren

Um mehrere Dateien und Ordner mit `pv` zu kopieren, ist ein kleiner Trick nötig. Wir verwenden `tar`, um die Dateien zu verschieben.

tar -c help-files/ | pv | tar -x -C Documents/

Der Teil `tar -c help-files/` erstellt ein Archiv der Dateien im Ordner `help-files`. Diese Daten werden durch `pv` geleitet, damit wir eine Fortschrittsanzeige sehen. Anschließend wird es wieder zu `tar` geleitet, wo das Archiv entpackt (`-x`) und das Arbeitsverzeichnis zu `Documents` geändert wird (`-C`).

Somit werden die Dateien und Ordner aus `help-files` mit einer Fortschrittsanzeige in den Ordner „Documents“ kopiert.

Die Ausgabe sieht diesmal etwas anders aus.

Wir erhalten keine ETA. Der Fortschrittsbalken zeigt einen sich bewegenden Indikator, der anzeigt, dass der Prozess aktiv ist, aber er wächst nicht von links nach rechts wie ein üblicher Fortschrittsbalken. `pv` ist begrenzt in den Informationen, die es aus dem weitergeleiteten Prozess extrahieren kann.

`pv` und `tar` zur Archiverstellung

Das Kopieren von Dateien mit `pv` und `tar` erzeugt keine Archivdatei. `tar` erstellt eine Art „virtuelles“ Archiv, das direkt wieder in `tar` eingespeist wird, um die Dateien zu extrahieren. Wenn das Ziel das Kopieren von Dateien ist, ist dies ausreichend. Aber was, wenn wir eine Archivdatei erstellen möchten?

Wir können weiterhin `tar` verwenden, um eine Archivdatei zu erstellen und von `pv` einen Fortschrittsbericht zu erhalten. Die verwendeten `tar`-Optionen sind `-c` (Archiv erstellen), `-z` (mit gzip komprimieren) und `-f` (Dateiname des Archivs).

Beachten Sie, dass wir `-` als Dateinamen verwenden, wodurch `tar` die Ausgabe nach stdout schreibt. Diese Ausgabe sehen wir nicht, da sie an `pv` weitergeleitet wird.

Der tatsächliche Name des Archivs wird der Dateiname sein, in den wir die Ausgabe von `pv` leiten, in diesem Fall `help-files.tgz`.

tar -czf - ./help-files/ | pv > help-files.tgz

Wir erhalten die gleichen Fortschrittsanzeigen wie zuvor und die Archivdatei wird erstellt.

Die Anzeigeoptionen von `pv`

Es gibt verschiedene Optionen, mit denen Sie die angezeigten Details von `pv` anpassen können.

Die Verwendung einer dieser Optionen deaktiviert alle anderen Optionen. Wenn Sie also drei Anzeigeoptionen nutzen wollen, müssen Sie alle drei angeben.

Die Verwendung von `pv` ohne Optionen ist äquivalent zur Verwendung der Option `-pterb`.

-p: Zeigt den abgeschlossenen Prozentsatz an. Dies ist der Fortschrittsbalken und die Prozentangabe.
-t: Zeigt die vergangene Zeit an.
-e: Zeigt die ETA an.
-r: Zeigt die Datenübertragungsrate an.
-b: Zeigt die Anzahl der übertragenen Bytes an.
-n: Zeigt den Prozentsatz als ganze Zahl an. Dies gibt den abgeschlossenen Prozentsatz als Ganzzahl aus und jede Aktualisierung wird in einer neuen Zeile angezeigt.

Wiederholen wir den letzten Befehl und übergeben `pv` die Option `-p` (Prozent abgeschlossen):

tar -czf - ./help-files/ | pv -p > help-files.tgz

Dies schaltet alle anderen Anzeigeoptionen aus. `pv` liefert nur den prozentualen Fortschritt.

Da `pv` keine Prozentzahl von `tar` erhält, wird der Fortschrittsbalken durch einen sich bewegenden Indikator ersetzt. Es gibt keine Prozentangabe.

`pv` mit `wc` verwenden

Wir können `pv` verwenden, um eine Textdatei (oder Dateien) an `wc` weiterzuleiten. `wc` zählt die Zeilenumbrüche, Zeichen und Wörter, während `pv` einen Fortschrittsbericht liefert.

Hier leiten wir alle „*.page“-Dateien im Verzeichnis `help-files` an `wc` weiter.

Sobald `wc` fertig ist, sehen wir die Anzahl der Zeilenumbrüche, Zeichen und Wörter aus allen „*.page“-Dateien im Ordner `help-files`.

Installation des `progress`-Befehls

Der Befehl `progress` liefert die gleichen Art von nützlichen Informationen wie `pv`, funktioniert aber mit einer bestimmten Auswahl von Linux-Befehlen.

Um `progress` auf Ubuntu zu installieren, verwenden Sie diesen Befehl:

sudo apt-get install progress

Um `progress` auf Fedora zu installieren, verwenden Sie diesen Befehl:

sudo dnf install progress

Um `progress` auf Manjaro zu installieren, verwenden Sie diesen Befehl:

sudo pacman -Syu progress

Befehle, mit denen `progress` funktioniert

Wenn Sie `progress` in ein Terminal eingeben und die Eingabetaste drücken, erhalten Sie eine Liste der Befehle, mit denen `progress` zusammenarbeitet.

progress

`progress` mit Pipes verwenden

Es gibt zwei Methoden, um den Fortschritt von Befehlen zu überwachen. Die erste ist die Verwendung von Pipes.

Der Befehl `tar` befindet sich in der Liste der unterstützten Befehle, also werden wir `tar` verwenden.

Die verwendeten Optionen sind die Standardoptionen `-c` (Archiv erstellen), `-z` (mit gzip komprimieren) und `-f` (Dateiname). Wir erstellen ein komprimiertes Archiv von allem im Ordner `help-files`, und das Archiv wird „help.tgz“ heißen.

Wir leiten dies an `progress` weiter und verwenden die Option `-m` (monitor), um sicherzustellen, dass `progress` über den Prozess berichtet, bis er abgeschlossen ist.

tar -czf help.tgz ./help-files/ | progress -m

Das Terminalfenster zeigt den Fortschritt des `tar`-Befehls während der Archiverstellung.

Während jede Datei verarbeitet wird, wird sie mit den folgenden Informationen aufgelistet:

Die Prozess-ID.
Der Prozessname.
Prozentsatz abgeschlossen.
Verarbeitete Daten und Gesamtgröße der Datei.
Datenrate (Durchsatz).
Geschätzte Restzeit (ETA).

Sie werden überrascht sein, dass ein zweiter Datensatz angezeigt wird. Der erste Datensatz bezieht sich auf `tar`. Der zweite auf `gzip`. `tar` ruft `gzip` auf, um die Komprimierung durchzuführen. Da `gzip` auf der Liste der unterstützten Befehle steht, werden Fortschrittsberichte dazu angezeigt.

`progress` im kontinuierlichen Überwachungsmodus

Sie können `progress` in einem kontinuierlichen Echtzeitüberwachungsmodus verwenden, indem Sie die Option `-M` (Monitor) nutzen.

Geben Sie den folgenden Befehl in ein Terminalfenster ein:

progress -M

`progress` meldet, dass keine Befehle zur Überwachung ausgeführt werden. Es kehrt jedoch nicht zur Befehlszeile zurück. `progress` wartet, bis ein Befehl gestartet wird, den es überwachen kann, und beginnt dann automatisch mit der Berichterstattung.

Geben Sie in einem anderen Terminalfenster einen Befehl ein, der sich auf der Liste der Befehle befindet, die `progress` überwachen kann.

Wir werden `cat` verwenden. Befehle, die zu schnell abgeschlossen werden, werden nicht mit `progress` registriert, daher listen wir den Inhalt einer sehr langen Textdatei auf.

cat words.page

Im Terminalfenster mit `progress` werden Statistiken für den `cat`-Befehl angezeigt, während er ausgeführt wird.

Sobald `cat` die Auflistung beendet hat, geht `progress` wieder in seinen Wartezustand über.

Jedes Mal, wenn einer der Befehle, über die es berichten kann, eine größere Aufgabe erledigt, wird `progress` automatisch dessen Fortschritt überwachen.

Das ist wirklich praktisch.

100% abgeschlossen

Beenden Sie das Rätselraten, wie sich ein zeitaufwendiger Befehl verhält, und verabschieden Sie sich vom Anstarren des Cursors mit `pv` und `progress`.