Der Befehl `tmux` in Linux ist ein Terminal-Multiplexer, vergleichbar mit `screen`. Angesichts der zahlreichen Befürworter haben wir uns entschlossen, diese beiden Programme zu vergleichen. Ist `tmux` wirklich überlegen oder geht es lediglich um die Präferenz für das Bekannte?
`tmux` im Vergleich zu `screen`
Sowohl `tmux` als auch `screen` (GNU Screen) sind Terminal-Multiplexer. Sie erlauben es, mehrere Fenster innerhalb eines einzigen Terminalfensters zu verwalten und zwischen diesen hin und her zu wechseln. Jedes Fenster kann in Bereiche unterteilt werden, die jeweils eine eigene Befehlszeile darstellen.
Man kann eine Sitzung auch abkoppeln, sodass sie im Hintergrund weiterläuft – selbst wenn das Terminalfenster geschlossen wird, aus dem sie gestartet wurde. Später kann man ein neues Terminal öffnen und die laufende Sitzung wieder aufnehmen. Dies funktioniert auch über eine SSH-Verbindung.
Somit kann man eine Sitzung auf einem Rechner abkoppeln, nach Hause fahren und sich dann vom dortigen Computer aus wieder an der Sitzung anmelden und sie interaktiv nutzen.
Was ist `screen`?
Der Befehl `screen` ist ebenfalls ein Terminal-Multiplexer mit einer Fülle von Optionen. In einem anderen Artikel haben wir bereits ausführlich dessen Fähigkeiten beleuchtet.
Diesmal fokussieren wir uns auf `tmux`. Wir werden jedoch immer wieder erwähnen, wie `screen` mit den gleichen Aufgaben umgeht.
Es gibt eine Sache an `screen`, die uns missfällt. Wir werden darauf später eingehen und prüfen, ob `tmux` diese besser handhabt.
Installation von `tmux`
Während `screen` meist standardmäßig auf Linux-Distributionen installiert ist, trifft dies auf `tmux` nicht zu. Unter Ubuntu installieren Sie `tmux` wie folgt:
sudo apt-get install tmux
Unter Manjaro verwenden Sie Pacman:
sudo pacman -Sy tmux
Auf Fedora 31 ist `tmux` bereits vorinstalliert.
Starten einer `tmux`-Sitzung
Um `tmux` zu starten, tippen Sie einfach `tmux` ein und drücken Sie Enter:
tmux
Sobald Sie sich in einer `tmux`-Sitzung befinden, zeigt das Terminalfenster eine Statusleiste an.
Auf der rechten Seite der Statusleiste werden der Hostname, die Uhrzeit und das Datum angezeigt. Links werden Sitzungsinformationen angezeigt:
[0]: Dies ist der Sitzungsname. Standardmäßig werden Sitzungen mit aufsteigenden Zahlen beginnend bei Null benannt. Weiter unten erfahren Sie, wie Sie Sitzungen aussagekräftige Namen geben können.
0:bash*: Die 0 zeigt an, dass dies das erste Fenster innerhalb dieser Sitzung ist. Der einzige laufende Prozess in diesem Fenster ist die Bash. Wenn Sie ein anderes Programm ausführen, wird dessen Name hier angezeigt. Das Sternchen kennzeichnet das aktuell sichtbare Fenster. Jedes Mal, wenn Sie in einer `tmux`-Sitzung ein neues Fenster erstellen, werden Fensternummer und Programmname der Statusleiste hinzugefügt.
`screen` bietet keine Statusleiste. Man ist auf seine eigene Orientierung angewiesen, um zu wissen, was gerade läuft, was etwas Übung erfordert.
Positiv ist, dass man dadurch keine Zeile der Terminalfenster-Fläche verliert. Allerdings erweitert man in der Regel das Terminalfenster, um die Vorteile eines Multiplexers richtig nutzen zu können, sodass der Verlust einer Zeile für die Statusleiste kein Problem darstellt. Die gezeigten Terminalfenster sind in Standardgröße, damit die Informationen gut erkennbar sind.
Befehle werden an `tmux` über Tastenkombinationen übermittelt, die aus zwei Teilen bestehen. Zunächst drücken Sie Strg+B, um `tmux` zu aktivieren, dann schnell die nächste Taste, um einen Befehl auszuführen. Befehle werden mit Buchstaben, Zahlen, Satzzeichen oder Pfeiltasten gegeben.
Bei `screen` ist es ähnlich, nur dass man Strg+A drückt, um seine Aufmerksamkeit zu erlangen.
Um das Fenster zu schließen, drücken Sie Strg+B und dann schnell X. Die Statusleiste wird gelb. Sie werden nun aufgefordert zu bestätigen, dass Sie das Fenster schließen möchten.
Drücken Sie Y zum Schließen des Fensters oder N, falls Sie es sich anders überlegen. Es ist nicht nötig, Enter zu drücken; Y oder N genügen zur Bestätigung.
Wenn Sie Y drücken, wird das Fenster geschlossen. Da es das einzige Fenster in dieser Sitzung war, wird die Sitzung beendet. `[exited]` Die `tmux`-Sitzung wird geschlossen und Sie kehren zur Befehlszeile zurück, aus der Sie `tmux` gestartet haben. Sie sehen dann den Text „„“ im Terminal.
Dies mag offensichtlich klingen, aber es bestätigt, dass Sie die Sitzung geschlossen und nicht nur abgetrennt haben. Das Trennen von Sitzungen wird weiter unten behandelt.
Starten einer benannten `tmux`-Sitzung
Wenn Sie regelmäßig mehrere `tmux`-Sitzungen starten, werden Sie die Möglichkeit schätzen, jeder einen aussagekräftigen Namen zu geben. Man kann auch `screen`-Sitzungen benennen, aber der Name wird in den Sitzungsfenstern nicht angezeigt.
tmux new -s geek-1
Um `tmux` mit einem Sitzungsnamen zu starten, verwenden Sie den Befehl `new` (neue Sitzung) und die Option `-s` (Sitzungsname). Wir nennen unsere Sitzung „geek-1“, also geben wir Folgendes ein:
Eine `tmux`-Sitzung mit Namen
Hinzufügen weiterer Fenster. Um ein neues Fenster in der aktuellen Sitzung zu erstellen, drücken Sie Strg+B und dann C. Sie erhalten ein leeres Terminalfenster in der aktuellen Sitzung. Um nun etwas in diesem neuen Fenster auszuführen, starten wir den Befehl `dmesg`
dmesg -w
mit der Option `-w` (folgen):
Jetzt haben wir zwei Fenster in der Sitzung; eines mit `top` und eines mit `dmesg`. Wir können aber jeweils nur eines sehen (mehr dazu gleich).
Sehen Sie auf die linke Seite der Statusleiste. Wir befinden uns noch immer in der `tmux`-Sitzung „Geek-1“. In Fenster Null läuft `top`, in Fenster Eins `dmesg`. Das Sternchen zeigt an, welches Fenster gerade sichtbar ist.
Um zwischen den Fenstern zu wechseln, drücken Sie Strg+B und dann eine der folgenden Tasten:
N: Zeigt das nächste Fenster.
P: Zeigt das vorherige Fenster.
0 bis 9: Zeigt das Fenster mit der entsprechenden Nummer.
Sie können auch ein Fenster aus einer Liste auswählen. Drücken Sie Strg+B und dann W. Daraufhin erscheint eine Liste der Fenster.
Um die gelbe Markierungsleiste zu bewegen, nutzen Sie die Pfeiltasten hoch und runter, Pos1 oder Ende. Der untere Bereich zeigt eine Vorschau des Inhalts des markierten Fensters an.
Drücken Sie Enter, um zum markierten Fenster zu wechseln, oder Esc, um die Fensterliste ohne Wechsel zu schließen.
Trennen und Wiederherstellen von Sitzungen
Wenn Sie Strg+B und dann D drücken, wird die Sitzung getrennt. Sie läuft weiter im Hintergrund, ist aber nicht mehr sichtbar oder interaktiv.
Wir haben ganz oben in der Sitzung begonnen, also haben wir einen laufenden Prozess, mit dem wir dies demonstrieren können. Wir drücken also Strg+B und dann D. Die Sitzung verschwindet und wird zu einer Hintergrundsitzung.
Wir kehren zum ursprünglichen Terminalfenster zurück. Dort erscheint eine Meldung von `tmux`, dass die Sitzung getrennt wurde. Sie erinnert uns auch an den Namen, den wir der Sitzung gegeben haben. Dies ist praktisch, da wir damit eine Hintergrundsitzung wieder aufrufen und in einer interaktiven Sitzung fortfahren können.
tmux attach-session -t geek-1
Um eine getrennte Sitzung wiederherzustellen, verwenden wir den Befehl `attach-session` mit der Option `-t` (Ziel-Sitzung). Wir geben auch den Namen der Sitzung an, die wir abrufen möchten.
Wir geben Folgendes ein:
Unsere Sitzung kehrt zurück und wird wieder zu einer sichtbaren, interaktiven Sitzung.
Alle langlaufenden oder kontinuierlichen Prozesse, die Sie vor dem Trennen gestartet haben, laufen weiterhin im Hintergrund (sofern sie nicht beendet wurden), wenn Sie die Sitzung wieder aktivieren.
Dies kann auch `screen`, aber es ist nicht so intuitiv.
tmux new -s geek-2
Verwalten mehrerer Sitzungen
dmesg -w
Öffnen wir ein weiteres Terminalfenster und starten eine neue `tmux`-Sitzung mit dem Namen „geek-2“:
In dieser Sitzung starten wir `dmesg`:
Nun haben wir unsere ursprüngliche `tmux`-Sitzung „geek-1“ und eine neue namens „geek-2“.
Die Statusleiste zeigt uns, dass diese Sitzung „geek-2“ heißt und ein Fenster hat, in dem `dmesg` läuft.
Wenn wir Strg+B und dann D drücken, wird diese Sitzung getrennt.
Zurück in der `tmux`-Sitzung „geek-1“ drücken wir Strg+B und dann S, um eine Liste der `tmux`-Sitzungen anzuzeigen.
Um es klarzustellen, dies ist eine Liste von Sitzungen. Die ähnliche Anzeige, die wir zuvor gesehen haben, war eine Liste von Fenstern innerhalb einer Sitzung.
Mit den Auf- und Abwärtspfeiltasten, Pos1 und Ende kann man die gelbe Markierungsleiste bewegen. Der untere Abschnitt zeigt eine Vorschau des Inhalts der markierten Sitzung an.
Wenn Sie die Pfeiltaste nach rechts drücken, werden die Fenster der markierten Sitzung angezeigt.
Drücken Sie Enter, um zur markierten Sitzung oder zum markierten Fenster zu wechseln, oder Esc, um die Sitzungsliste ohne Änderungen zu verlassen. Wenn Sie eine neue Sitzung auswählen, wird Ihre aktuelle Sitzung getrennt und die gewählte Sitzung wird angehängt.
Wir haben die „Geek-2“-Sitzung getrennt, bevor wir dies taten. Man kann dies jedoch auch mit Sitzungen tun, die noch mit ihren ursprünglichen Terminalfenstern verbunden sind. In diesem Fall werden alle Änderungen in beiden `tmux`-Sitzungen gleichzeitig angezeigt.
Auch der Befehl `screen` ermöglicht dies mit ähnlichen Befehlsstrukturen.
Arbeiten mit Fensterbereichen
Wenn Sie Strg+B und dann Anführungszeichen („“) drücken, wird das Fenster horizontal in zwei Bereiche aufgeteilt.
Dies betrifft nur das aktuelle Fenster; die anderen in der Sitzung bleiben unverändert. Wir haben den Befehl `tmux ls` im oberen Bereich verwendet, um die Fenster in dieser Sitzung aufzulisten. Es sind zwei, und die Statuszeile zeigt an, dass wir uns im ersten Fenster befinden. Wenn wir mit Strg+B und 0 (Null) zum Fenster Null zurückkehren, sehen wir, dass es noch so ist, wie wir es verlassen haben.
Es handelt sich um zwei unabhängige Befehlszeilen und nicht um zwei Ansichten innerhalb eines Fensters; sie sind verschiedene, separate Shells. Dies wird sichtbar, wenn wir in jedem Bereich einen anderen Befehl ausführen.
Wir geben ein:
uname -a
ls -hl
Um von einem Bereich zum anderen zu wechseln, drücken Sie Strg+B und anschließend eine der Pfeiltasten (hoch, runter, links oder rechts).
Wenn Sie Strg+B und dann das Prozentzeichen (%) drücken, wird das aktuelle Fenster vertikal geteilt.
Drücken Sie Strg+B und dann Q. `tmux` lässt kurz die Nummer jedes Fensters aufblinken.
Diese Nummern werden in Eingabeaufforderungen und Meldungen von `tmux` verwendet. Um den aktuellen Bereich zu schließen, drücken Sie Strg+B und dann X. Die Statusleiste wird gelb und Sie werden aufgefordert zu bestätigen, dass Sie diese Fensternummer schließen möchten. Drücken Sie Y, um das Fenster zu entfernen, oder N, um alles unverändert zu lassen.
Wenn Sie Y drücken, wird der Bereich entfernt.
Der Befehl `screen` bietet ebenfalls Bereiche, die jedoch weniger intuitiv zu nutzen sind. Was uns an `screen` stört, ist, dass beim Trennen einer Sitzung mit Fenstern diese verschwinden, wenn man diese Sitzung wiederherstellt. Das nervt sehr schnell.
Ein Spickzettel für Strg+B
Hier ist ein Spickzettel mit verschiedenen Befehlen, die in `tmux` verwendet werden können:
Sitzungsbefehle:
S: Sitzungen auflisten.
$: Aktuelle Sitzung umbenennen.
D: Aktuelle Sitzung trennen.
Strg+B gefolgt von ?: Hilfeseite in `tmux` anzeigen.
Fensterbefehle:
C: Neues Fenster erstellen.
,: Aktuelles Fenster umbenennen.
W: Fenster auflisten.
N: Zum nächsten Fenster wechseln.
P: Zum vorherigen Fenster wechseln.
0 bis 9: Zum angegebenen Fenster wechseln.
Bereichsbefehle:
%: Horizontale Teilung erstellen.
„: Vertikale Teilung erstellen.
H oder Linkspfeil: Zum linken Bereich wechseln.
I oder Rechtspfeil: Zum rechten Bereich wechseln.
J oder Abwärtspfeil: Zum darunter liegenden Bereich wechseln.
K oder Aufwärtspfeil: Zum oberen Bereich wechseln.
Q: Fensternummern kurz anzeigen.
O: In der Reihenfolge durch die Bereiche schalten. Bei jedem Drücken wird der nächste Bereich angezeigt, bis man alle durchlaufen hat.
}: Aktuelle Bereichsposition mit dem nächsten vertauschen.
{: Aktuelle Bereichsposition mit dem vorherigen vertauschen.
X: Aktuellen Bereich schließen.
Vergleich
In Bezug auf die Funktionalität funktionieren `screen` und `tmux` ähnlich und bieten im Wesentlichen dieselben Kernfunktionen. Die Art und Weise, wie man auf diese Funktionen zugreift, ist jedoch deutlich unterschiedlich. `tmux` bietet übersichtlichere und komfortablere Methoden, um auf die verschiedenen Funktionen zuzugreifen. Das ist aber nicht der einzige Unterschied.
Die Möglichkeit, Sitzungen und Fenster in `tmux` umzubenennen, ist hilfreich, und die Tatsache, dass die Fenster beim Wiederherstellen einer Sitzung erhalten bleiben, ist ein enormer Vorteil.
Im Gegensatz dazu verliert `screen` die Fenster vollständig, wenn eine Sitzung getrennt und wieder angehängt wird. Das ist fast schon nervig genug, um von vornherein ein Abkoppeln zu vermeiden.
`tmux` bietet so viel mehr, einschließlich seiner unglaublich flexiblen Scripting-Funktionen. Sie sind es sich selbst schuldig, es auszuprobieren.