OpenSource-Tipp: Tmux

Mit 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 Michi Zaugg, wies geht.

Autor/in Michi Zaugg
Datum 11.08.2014
Lesezeit 5 Minuten

Mit tmux (terminal multiplexer) ist es möglich, in einem Terminal mehrere Sessions bzw. Shells zu verwalten (à la screen) 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, zeige ich euch, wies geht.

Wieso und warum überhaupt, da muss ich kurz ausholen. Ich möchte einen länger dauernden Prozess starten, möchte dazu aber nicht das Terminal offen halten müssen bzw. angemeldet bleiben. Später möchte ich 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 ich das Fenster bzw. meine Session schliesse. 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 Fachbereichsleiter Linux und Unix bei Digicomp. Er arbeitet seit 12 Jahren in der Informatikbranche. Als Netzwerk- und Sicherheitsadministrator leitete er ein Netzwerkteam und studiert derzeit berufsbegleitend Informatik an der Hochschule Rapperswil (Informatik Ing. FH.). Zudem verfügt er über die LPI-Zertifizierung.