Die Kommandozeile bietet zahlreiche clevere Werkzeuge, die kaum jemand kennt. Wir stellen die nützlichsten davon vor.
Bei genauerem Hinsehen entpuppt sich Linux als wahre Wundertüte voller Werkzeuge. Ein Teil davon haben wir in der letzten Ausgabe bereits ausgepackt [1] und dabei jede Menge Unbekannte ans Licht befördert.
Zahlreiche der Tools finden Sie im Paket Coreutils [2], das viele Distributoren als essenziell ansehen und aus diesem Grund mit in die Standardinstallation packen. Sollte es auf der von Ihnen verwendeten Distribution wider Erwarten nicht eingespielt sein, installieren Sie es über die Paketverwaltung nach.
Dieser Artikel benennt das Software-Paket für Debian, Ubuntu und deren Derivate, in dem Sie das jeweils besprochene Werkzeug finden. Bei anderen Distributionen heißt das zu installierende Paket unter Umständen anders.
Zeitgesteuert
Zu den Kommandos, mit denen Sie zeitgesteuert Programme ausführen, gehören Sleep, Batch, Cat, Atq, Atrm sowie Crontab. Eher selten kommen Befehle zum Einsatz, mit denen man die Laufzeit eines Aufrufs begrenzt. In diese Kategorie fallen Werkzeuge wie Timeout aus den coreutils und Timelimit aus dem gleichnamigen Paket. Abbildung 1 zeigt, wie Sie mittels Timeout die Ausführung eines Kommandos nach zehn Sekunden abbrechen.

Abbildung 1: Mittels Timeout begrenzen Sie bei Bedarf die Ausführungszeit eines Programms, in diesem Beispiel auf zehn Sekunden.
Weigert sich ein Programm beharrlich, zu terminieren, senden Sie üblicherweise das Signal SIGKILL an die entsprechende Prozess-ID. Timeout nimmt Ihnen diese Aufgabe ab. Es versteht dazu den Schalter -k (kurz für --kill-after) gefolgt von der Angabe des zu sendenden Signals. Mit dem Aufruf aus der ersten Zeile von Listing 1 senden Sie dem Tail-Prozess nach zehn Sekunden das Signal 9 (SIGKILL).
Das Werkzeug Timelimit erledigt denselben Job, schickt jedoch vorab noch ein Warnsignal los. Dann wartet es eine festgelegte Zeitspanne und übermittelt dem Prozess dann das Signal 9 zum endgültigen Abbruch (SIGKILL). Falls Sie nichts anderes angeben, verwendet das Programm die in der Tabelle “Timelimit-Parameter” angegebenen Schalter und Werte. Das Beispiel aus der zweiten Zeile von Listing 1 zeigt, wie Sie die Zeit bis zum endgültigen Beenden beeinflussen.
Listing 1
$ timeout -s9 10s tail -f /var/log/messages $ timelimit -t10 tail -f /var/log/messages
|
Schalter |
Erläuterung |
Vorgabe |
|---|---|---|
|
|
Signal zum geordneten Beenden des Prozesses |
15 ( |
|
|
Laufzeit des Prozesses bis zum Beendigen-Signal |
3600 Sekunden |
|
|
Signal zum endgültigen Abbrechen des Prozesses |
9 ( |
|
|
Wartezeit zwischen Beendigen- und Abbrechen-Signal |
120 Sekunden |
Daten übertragen
Manche Aufgaben erfordern es, Abbilder von Partitionen, SD-Karten oder Festplatten zu transferieren – sei es zum Vorbereiten eines USB-Sticks mit einem ISO-Image oder als Backup per SSH auf einen anderen Rechner. Oft kommen dabei die Kommandos dd oder zcat und eine Pipe zum Einsatz; manchmal genügt auch einfach nur ein cp im Terminal.
Da die Kommandos meist große Datenmengen transferieren, wäre eine Fortschrittsanzeige praktisch, um abzuschätzen, wie lange die Übertragung noch dauert. Zcat und Cp bieten eine solche Möglichkeit von sich aus nicht an. Bei Dd gibt es die Option status=progress erst seit Coreutils 8.24 (Juli 2015), in Distributionen wie Ubuntu 14.04 LTS “Trusty” oder Debian 8 “Jessie” fehlt sie noch. Daher kommen hier ein paar Alternativen ins Spiel, die sich dazu eignen, den Strom von Daten zu messen (siehe Tabelle “Durchflussmesser”).
Bis auf Progress funktionieren alle recht ähnlich: Sie schicken den Datenstrom durch eine Pipe an das entsprechende Kommando, etwa pv [3], und das gibt auf dem Terminal die Durchflussgeschwindigkeit sowie die bereits verarbeitete Menge an Daten an (Listing 2, erster Aufruf). Geben Sie Pv die Option -s und die Größe der erwarteten Datenmenge mit (zweiter Aufruf), so kalkuliert es die Gesamtdauer und gibt einen Fortschrittsbalken aus. Das Kürzel ETA steht für Estimated Time of Arrival, also die geschätzte Ankunftszeit.
Die Programme Bar (Listing 3) und Pipemeter (Listing 4) funktionieren sehr ähnlich. Seit Ubuntu 16.04 LTS und Debian 9 “Stretch” bringt auch Dd eine Fortschrittsanzeige mit (Listing 5).
|
Kommando |
Paket |
|---|---|
|
|
pv |
|
|
bar |
|
|
pipemeter |
|
|
coreutils |
|
|
cpipe |
|
|
progress |
Listing 2
$ zcat 9pi.img.gz | pv > /dev/null 480MiB 0:00:04 [ 116MiB/s] [ <=> ] $ zcat 9pi.img.gz | pv -s 480M > /dev/null 178MiB 0:00:02 [76.5MiB/s] [===========> ] 37% ETA 0:00:03
Listing 3
$ zcat 9pi.img.gz | bar > /dev/null 480.0MB at 120.0MB/s elapsed: 0:00:04 Copied: 503316480B (480.0MB) Time: 4 seconds Throughput: 125829120B (120.0MB/s) $ zcat 9pi.img.gz | bar -s 480M > /dev/null 119.1MB at 59.5MB/s eta: 0:00:06 24% [====== ] [...] 480.0MB at 120.0MB/s eta: 0:00:00 100% [========================] Copied: 503316480B (480.0MB) (100% of expected input) Time: 4 seconds Throughput: 125829120B (120.0MB/s)
Listing 4
$ zcat 9pi.img.gz | pipemeter > /dev/null 120.00M/s 480.00M 8.00k 0:00:04 $ zcat 9pi.img.gz | pipemeter -s 480M > /dev/null [********------------------------] 115.18M/s 115.18M 24.0% 0:00:03 [?] [********************************] 120.00M/s 480.00M 100.0% 0:00:04
Listing 5
$ zcat 9pi.img.gz | dd status=progress > /dev/null
473956864 bytes (474 MB, 452 MiB) copied, 4 s, 118 MB/s
983040+0 records in
983040+0 records out
503316480 bytes (503 MB, 480 MiB) copied, 4.18 s, 120 MB/s
Der Befehl cpipe macht im Prinzip dasselbe, funktioniert aber etwas anders: Er benötigt zwingend die Angabe eines Parameters (Listing 6), außerdem gibt er pro Messzyklus eine eigene Zeile aus. Dafür kennt er die Option -s, über die Sie bei Bedarf den Durchsatz begrenzen.
Listing 6
$ zcat 9pi.img.gz | cpipe -vt > /dev/null
thru: 1.144ms at 109.3MB/s ( 109.3MB/s avg) 128.0kB
thru: 1.223ms at 102.2MB/s ( 103.8MB/s avg) 256.0kB
thru: 1.525ms at 82.0MB/s ( 95.1MB/s avg) 384.0kB
thru: 1.605ms at 77.9MB/s ( 89.9MB/s avg) 512.0kB
thru: 1.719ms at 72.7MB/s ( 85.5MB/s avg) 640.0kB
thru: 1.542ms at 81.1MB/s ( 84.6MB/s avg) 768.0kB
thru: 1.611ms at 77.6MB/s ( 83.3MB/s avg) 896.0kB
thru: 1.658ms at 75.4MB/s ( 82.1MB/s avg) 1024.0kB
thru: 1.538ms at 81.3MB/s ( 81.9MB/s avg) 1.1MB
thru: 1.599ms at 78.2MB/s ( 81.4MB/s avg) 1.2MB
thru: 1.704ms at 73.4MB/s ( 80.5MB/s avg) 1.4MB
thru: 1.473ms at 84.9MB/s ( 80.8MB/s avg) 1.5MB
Das Tool Progress dient zwar demselben Zweck, arbeitet aber grundsätzlich anders als die bisher vorgestellten: Sie klemmen es nicht mittels Pipe in den Datenstrom. Stattdessen schaut es von außen auf die Prozesse und findet in der Regel gleich das richtige Programm. Rufen Sie es zu einem Zeitpunkt auf, zu dem Sie gerade keine Daten hin- und herschieben, verrät es, nach welchen Werkzeugen es schaut (Listing 7).
Listing 7
$ progress
No command currently running: cp, mv, dd, tar, cat, rsync, grep, fgrep, egrep, cut, sort, md5sum, sha1sum, sha224sum, sha256sum, sha384sum, sha512sum, adb, gzip, gunzip, bzip2, bunzip2, xz, unxz, lzma, unlzma, 7z, 7za, zcat, bzcat, lzcat, split, gpg, or wrong permissions.
Rufen Sie in einer Shell das Kommando zcat Archiv.gz > /dev/null auf und starten in einer anderen Progress, dann sehen Sie eine Ausgabe ähnlich wie in Listing 8. Bei der Zahl in eckigen Klammern am Beginn der Ausgabe handelt es sich um die Prozess-ID. Im Gegensatz zu den anderen Programmen analysiert Progress bei Archiven nicht den Umfang der dekomprimierten Daten, sondern die Größe der komprimierten Datei auf dem Dateisystem. Das Tool schaut bei den laufenden Programmen darauf, an welcher Stelle in der zum Lesen geöffneten Datei diese sich momentan befinden – eigentlich relativ simpel.
Listing 8
$ progress
[19153] gzip /home/abe/Images/Raspberry_Pi/9pi.img.gz
14.0% (17.1 MiB / 121.8 MiB)
Der Aufruf aus Listing 8 liefert lediglich einen Schnappschuss, der den aktuellen Stand ausgibt. Möchten Sie das Kopieren von Daten über längere Zeit beobachten, nutzen Sie den Schalter -m (für Monitoring). Sinnigerweise starten Sie progress -m allerdings erst, wenn ein passender Prozess läuft. Die Software beendet sich automatisch, wenn sie keinen passenden Prozess mehr findet.
Mit der Option -M statt -m schalten Sie das automatische Beenden ab. Auf diese Weise rufen Sie Progress auf, bevor Sie eine Datenübertragung starten – im Prinzip ist dieser Modus äquivalent zu watch progress. Mit beiden Schaltern zeigt das Tool eine Leserate samt Hochrechnung der verbleibenden Zeit an (Listing 9).
Listing 9
$ progress -mM
[21040] gzip /home/abe/Images/Raspberry_Pi/9pi.img.gz
66.0% (80.4 MiB / 121.8 MiB) 40.0 MiB/s remaining 0:00:01
Wie Sie bereits in Listing 7 gesehen haben, unterstützt Progress bereits von Haus aus zahlreiche Werkzeuge. Fehlt ein benötigtes Tool, teilen Sie Progress das mit den Schaltern -c Programm (nur dieses Programm) und -a Programm (auch dieses Programm) mit. Das Werkzeug sucht dann nach passenden Aufrufen mit Lese- und Schreibvorgängen in geöffneten Dateien, beobachtet sie und gibt die passenden Daten aus.
Fazit
Die hier vorgestellten Werkzeuge bringen Pfiff in den Alltag. Sie unterscheiden sich in Details – manche bieten mehr Funktionen, andere konzentrieren sich auf das Wesentliche. Am besten stöbern Sie durch die Manpages der Tools. Das gelingt selbst ohne vorherige Installation, etwa indem Sie die Hilfeseiten online lesen [4].
Die Autoren
Der digitale Nomade Frank Hofmann arbeitet bevorzugt von Berlin, Genf und Kapstadt aus als Entwickler, LPI-zertifizierter Trainer und Autor. Axel Beckert ist als Linux-Systemadministrator und Spezialist für Netzwerksicherheit bei den Informatikdiensten der ETH Zürich beschäftigt. Das Duo hat das Debian-Paketmanagement-Buch (http://www.dpmb.org) verfasst.
Infos
-
Teil 1: Frank Hofmann, Axel Beckert, “Spielzeugkiste”, LU 03/2019, S. 94, https://www.linux-community.de/42248
-
Coreutils: https://packages.debian.org/coreutils
-
Fortschrittsanzeige mit Pv und Progress: https://www.howtoforge.com/tutorial/how-to-monitor-progress-of-linux-commands-using-pv-and-progress-utilities/
-
Manpages online: https://manpages.debian.org





