TIL: tmux mit vordefinierten Panes starten

Nicht nur auf dem Server, auch auf der lokalen Command Line ist tmux ein wichtiger Helfer und wird von mir täglich benutzt.

Für ein aktuelles Projekt habe ich das tmux-Fenster immer wieder in das gleiche Setup an Panes geteilt. In diesen Panes laufen auch immer dieselben Programme. Im Grunde geht es darum, einen lang laufenden Build-Prozess zu überwachen (Log-Ausgabe, CPU- und Speicherauslastung, Disk-I/O und Disk-Belegung).

Zweimal händisches Einrichten war dann für mich genug und ich habe geschaut, ob und wie man das Skripten kann.

In tmux lassen sich alle Kommandos (z. B. Fenster teilen, vergößern, verkleinern, verschieben usw.) zum einen interaktiv durchführen aber auch direkt über das tmux-Kommando in der Shell. Ich habe mir ein kleines Skript geschrieben, welches eine tmux-Session erstellt, das Fenster aufteilt und in den einzelnen Panes Programme startet:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash

SESSION="project"

tmux has-session -t $SESSION 2> /dev/null

if [[ $? == 0 ]]; then
    tmux attach-session -t $SESSION
    exit 0
fi

tmux new-session -d -s $SESSION
tmux split-window -h -t $SESSION:0.0
tmux split-window -v -t $SESSION:0.1
tmux split-window -v -t $SESSION:0.2
tmux send-keys -t $SESSION:0.0 "cd /opt/project && tail --retry -f -n 1000 build.log" Enter
tmux send-keys -t $SESSION:0.1 "htop" Enter
tmux send-keys -t $SESSION:0.2 "watch -n 3 iostat -k 1 2" Enter
tmux send-keys -t $SESSION:0.3 "watch -n 5 df -h" Enter
tmux attach-session -t $SESSION

Kurze Erklärung:

Die tmux-Session bekommt einen Namen („project“), an dem sie jederzeit identifizierbar ist. Im ersten Schritt wird geprüft, ob bereits eine Session mit dem gegebenen Namen existiert. Das has-session Kommando liefert einen Return-Status 0 falls das so ist. In diesem Fall wird sie einfach aktiviert und das Skript ist fertig.

Existiert noch keine Session, wird sie durch das Kommando new-session erstellt. Nachfolgend wird das Fenster mit split-window in sogenannte Panes geteilt: einmal horizontal, die rechte der beiden entstandenen Panes dann noch zweimal vertikal.

Windows und Panes lassen sich über $SESSION:$WINDOW.$PANE ansprechen, dabei wird normalerweise von 0 gezählt. Windows und Panes lassen sich wie auch die Session benamen. Das war hier aber nicht notwendig – die Zahlen sind ausreichend für meinen Zweck.

In jede der entstandenen Panes wird dann mit send-keys ein Kommando geschickt, welches in der dortigen Shell ausgeführt wird.

Schließlich wird die Session aktiviert und ich kann die für mich interessanten Parameter des Prozesses sehen.