Open Source-Tool Tmux effizient nutzen: Tipps und Tricks

Mit Terminal Multiplexer (Tmux) ist es möglich, mit einem Terminal mehrere Sessions bzw. Shells zu verwalten und diese auch im Hintergrund weiterlaufen zu lassen, sodass man
sich vom System abmelden und später die Arbeit exakt dort wieder aufnehmen kann. In diesem Tipp zeigt der zertifizierte Linux-Trainer Michi Zaugg, wies geht.

Autor/in Michi Zaugg
Datum 11.08.2014
Lesezeit 5 Minuten

In diesem Beitrag rund um tmux (terminal multiplexer) steigen wir direkt mit der Aufgabenstellung ein, um die Möglichkeit dieses Open-Source-Tools genauer aufzuzeigen: Wir möchten mit einer länger andauernde Arbeit gebinnen, möchten dazu aber nicht das Terminal offen halten müssen bzw. angemeldet bleiben. Später möchten wir natürlich das Resultat anschauen. Dieses Problem lässt sich relativ leicht mit nohup lösen. nohup (no hangup) hängt das gefolgte Kommando von meiner Session ab, d.h. es läuft auch weiter, wenn das Fenster bzw. meine Session geschlossen wird. Das sieht dann etwa so aus:


$ nohup sleep 1000 &
1 10480
nohup: ignoring input and appending output to `nohup.out'
$ ps -ef | grep sleep
tux 10480 10400 0 18:26 pts/1 00:00:00 sleep 1000
$ logout

Hier ist nun das gestartete sleep immer noch an meine Shell gebunden (PPID 10400). Da nohup sich von meiner Session abhängt, hat es auch nirgends mehr ein Terminal, wo das Kommando eine allfällige Ausgabe hineinschreiben könnte. Desshalb wird alles ins nohup.out gestellt. Dies befindet sich dort, wo ich nohup gestartet habe.


$ ps -ef | grep sleep
tux 10480 1 0 18:26 ? 00:00:00 sleep 1000

Wenn ich mich nun vom System ab- und wieder anmelde und erneut die Prozesstabelle anschaue, sehe ich, dass sleep nun wirklich von der ursprünglichen Shell entbunden wurde. Es sitzt nun direkt am Init (PPID 1).

Dies funktioniert alles soweit so gut, nur kann ich nicht mehr direkt interagieren. Der Prozess läuft zu Ende, und ich kann quasi nicht dort weiterfahren, wo ich aufgehört habe – ich habe ja nun eine neue Session. Mit einem Terminal-Multiplexer (tmux) kann ich in einem Terminal-Fenster mehrere Sessions verwalten, die auch offen bleiben, wenn ich das System verlasse, also mich abmelde.

tmux-Installation

Unter RedHat-Systemen kann tmux vom rpmforge Repository bezogen werden (CentOS Wiki). Nachdem das Repos hinzugefügt wurde, kann es mit


# yum install tmux

installiert werden.

Unter Debian-Systemen ist tmux bereit zur Installation:


# apt-get install tmux

tmux verwenden

Mit tmux wird eine neue Tmux-Session gestartet:


$ tmux

800px-Tmux_start
Tmux gestartet

In der Leiste unten sieht man – falls vorhanden – die verschiedenen Fenster. Zudem hat man per Default den Hostnamen und das Datum auf der rechten Seite. Um tmux zu verlassen, gebe ich einfach exit oder logout ein. Sobald ich das letzte tmux-Fenster auf diese Weise schliesse, wird allerdings auch die Session geschlossen. Wenn ich nun, was ja der Witz an der Sache ist, tmux weiterlaufen lassen möchte, wird dies mit Ctrl-b-d; (d wie detach) gemacht. (Übrigens, die meisten Befehle aus Screen funktionieren auch in tmux, anstatt, dass Ctrl-a gefolgt von einem Buchstaben verwendet wird, benutzt man in tmux Ctrl-b).

Dies bedingt am Anfang eine gewisse Feinmotorik: Ctrl gedrückt halten, b drücken, Ctrl und b loslassen, c drücken.

Hier die wichtigesten Tastenkürzel:

  • Neues Fenster aufmachen: Ctrl-b c (wie create)
  • Zum nächsten Fenster wechseln: Ctr-b n (wie next)
  • Zum vorherigen Fenster wechseln: Ctr-b p (wie previous)
  • Tmux Session detachen: Ctrl-b d (wie dettach)
  • Tmux Session wieder «holen»: $ tmux a
  • Dem aktuellen Fenster einen (anderen) Namen geben: Ctrl-b ,
  • Das aktuelle Fenster killen: Ctrl-b x

Session-Verwaltung

Selbstverständlich kann man tmux x-Mal laufen lassen. Denkbar ist es, verschiedene themenbasierte Sessions zu starten, z. B. «Server X», «Webadministration», «DNSAdmin», «Entwicklung». Mit


$ tmux new -s einname

wird eine neue tmux-Session mit dem Titel «einname» gestartet. Wenn man dies nicht macht, wird von 0 weg durchnummeriert.

Die Session «einname» kann man dann nach dem Detachen wieder holen mit


$ tmux attach -t einname

Wenn ich nicht mehr weiss, wie ich die Session benannt habe bzw. sehen will, welche gerade laufen, kann ich mir dies mit


$ tmux list-sessions

auflisten lassen.

Weitere Tipps zu tmux

Nett ist bei tmux, dass man ein eigenes Konfigfile erstellen kann unter ~/.tmux.conf. Dort können Tastenkombinationen erstellt, das Look&Feel angepasst oder auch Allgemeines wie der Scrollback-Buffer eingestellt werden (ach ja, übrigens, gescrollt wird in tmux mit Ctrl-b [, den Scroll-Modus verlässt man wieder mit ESC).

Beispiele für .tmux.conf

Historie verlängern:


set -g history-limit 100000

Aussehen anpassen:


set -g pane-border-fg white
set -g pane-active-border-fg white
set -g status-bg white
set -g status-fg black

Status rechts anpassen:


set -g status-right-length 60
set -g status-right "| #(whoami)@#H | #(awk '{print $1,$2,$3}' /proc/loadavg) | %Y-%m-%d %H:%M "

 


Autor/in

Michi Zaugg

Michi Zaugg ist IT-Leiter und Erwachsenenbildner (SVEB) mit Schwerpunkt auf LPI und Netzwerke. Neben seiner Tätigkeit in der Informatikbranche, in der er seit rund 25 Jahren tätig ist, engagiert er sich als Ausbildner für Feuerwehren in seiner Funktion als Chef Sanität. Er arbeitet seit rund 25 Jahren in der Informatikbranche und ist IT-Leiter in einer Non-Profit-Organisation mit einer grossen OpenSource-Infrastruktur. Er verfügt über diverse Netzwerkzertifizierungen und ist seit über 20 Jahren als zertifizierter Linux-Trainer im Einsatz (bis und mit LPIC 3). Seine Erfahrungen und sein umfangreiches Wissen – auch aus Projekten – vermittelt er gerne weiter.

2 Kommentare

foobar 12. August 2014, 13:47Uhr

Ach ja: Mit C-A als Meta-Key haben auch Leute, welche screen verwenden keine Mühe tmux zu benutzen, bzw. man muss sich nicht anpassen.

foobar 12. August 2014, 13:43Uhr

Ich habe noch folgendes in meiner Konfig, damit ich -a statt -b als Meta-Key verwenden kann. Dies, weil ich -b in vim und in Manpages oft zum zurückblättern verwende:

# C-a statt C-b als Meta-Key
unbind C-b
set -g prefix C-a
bind-key C-a last-window
bind-key a send-prefix

Foobar