02.032012

screen auf Steroiden: tmux

tmux, der Name steht für Terminal MUltipleXer, ist ein Projekt, das lang laufende, mit anderen teilbare, auch entfernt verfügbare Terminalsitzungen ermöglicht, so wie man das von GNU Screen gewohnt ist.

tmux verhält sich grundsätzlich ersteinmal identisch zu screen. Kommandos an tmux müssen mit einem Präfix-Key eingegeben werden. Die Vorgabe für diesen Präfix ist C-b – lustigerweise, weil tmux unter screen entwickelt wurde – lässt sich aber ohne weiteres anpassen. Mir kommt C-b sehr gelegen, da screen mit der Nutzung von C-a mit dem Kürzel für "Zeilenanfang" kollidiert, das ich doch sehr oft benutze.

Was tmux für die Systemadministration interessant macht, und da arbeitet es anders als screen, das in einer Sitzung eine beliebige Anzahl Fenster (Window, entspricht einer Terminalkonsole) zu verwalten erlaubt, von denen zu jedem Zeitpunkt aber nur eines sichtbar sein kann, ist, dass tmux erlaubt einzelne Fenster in Arbeitsflächen (Panes) aufzufteilen, so dass man mehrere Terminalkonsolen gleichzeitig im Blick haben kann. D.h. man kann über eine Konsole sowohl shell-kommandos absetzen, als auch einen tail beobachten – für die remote Nutzung etwa über Tablets (ConnectBot unter Android) sehr hilfreich.

http://www.joocom.de/blog/wp-content/uploads/wpid-tmux_screen_1_640_480.png

tmux ist Teil des OpenBSD Basissystems und wird nach wie vor aktiv entwickelt. The Changelog hat in einer der letzten Folgen ein interessantes Gespräch geführt, das viele Ideen zum kreativen Einsatz von tmux enthält – u.a. nutzen die Gäste tmux-Sitzungen zu Pair Programming. Das funktioniert, weil sich auf eine Sitzung mehrere Clients verbinden können. Anders als bei screen können verschiedene Clients aber nicht unterschiedliche Fenster bearbeiten. Alle Clients einer Sitzung sehen exakt dasselbe.

Bei der Nutzung ist zu beachten, dass die TERM Variable in der Shell außerhalb von tmux exakt zum verwendeten Terminal passen muss, und dass innerhalb von tmuximmer gilt TERM=screen. Die mögliche Ausnahme ist TERM=screen-256color für unterstützende Terminals.

Im Terminal scrollen ist bei einer Aufteilung in Arbeitsflächen natürlich nicht mehr möglich. tmux bietet dafür den copy-mode an, der neben dem Scrollen auch das Markieren und Kopieren von Text aus dem Terminal ermöglicht. Mit zusätzlichen Programmen kann man tmux auch so einrichten, dass es seinen Paste-Buffer mit der Fensterumgebung abgleicht. Ich benutze aktuell xclip dafür. Das ganze funktioniert auch über entfernte, ssh basierte Sitzungen, wenn auf dem entfernten Host die DISPLAY Variable korrekt gesetzt ist, und xclip installiert ist; natürlich nur dann, wenn die ssh-Verbindung mit X11Forwarding hergestellt wurde.

Insgesamt sieht meine aktuell noch sehr schmale Konfiguration (~/.tmux.conf) so aus:

# ich nutze rxvt-unicode mit 256 Farben
set-environment -g TERM screen-256color
# damit xclip lokal arbeiten kann
set-environment -g DISPLAY :0.0
# paste-buffer in die X11 selection
bind C-c run "tmux show-buffer | xclip -i -selection primary"# X11 selection in den tmux paste-buffer
bind C-v run "tmux set-buffer -- "$(xclip -o -selection primary)"; tmux paste-buffer"

Da es die Möglichkeit gibt, die Statuszeile um eigene kleine "Widgets" zu erweritern – CPU Load, Speicherauslastung, etc kommen einem in den Sinn – und man viele Kommandos durch bind auf Tastaturkürzel legen kann, wird die Konfiguration mit der Zeit sicherlich wachsen.