25.09.2009
Screen
von elm.
Screen ist für mich die wichtigste Anwendung für UNIX Server geworden. Es rüstet einige Features nach, die ich nicht mehr missen möchte, wenn ich per SSH einen Server administriere. Es ermöglicht mehrere Tabs über eine einzige SSH Sitzung zu benutzen und es speichert den aktuellen Stand bis man sich das nächste Mal anmeldet. So kann man angefangene Arbeit leicht wieder aufnehmen, oder längere Prozeduren, wie Aktualisierungen, laufen lassen, ohne dass man angemeldet ist und ohne dass irgendwelche Konsolenausgaben im Nirwana verschwinden.
Ich möchte hier meine Screenkonfiguration vorstellen und erläutern. So kann jeder Screen für seine Bedürfnisse anpassen und den maximalen Nutzen daraus ziehen.
Als erstes muss man Screen natürlich installieren. Unter Debian oder Ubuntu zum Beispiel mit
apt-get install screen
Individuelle Einstellungen für Screen nimmt man in der Regel in der .screenrc-Datei in seinem Home-Verzeichnis vor. Als erstes habe ich bei mir die Visual Bell ausgeschaltet mit
vbell off
Damit wird ein Ton ausgegeben und es blinkt nicht das ganze Fenster. Das ist sehr wohl Geschmackssache. Scrollen kann man mit
termcapinfo xterm* ti@:te@
aktivieren. Dann kann man im eigenen Terminal zurück scrollen.
Was Screen auch sehr nützlich macht, ist die Hardstatus-Zeile. Diese ist immer in der untersten Zeile des Terminals. In dieser kann man sich beliebige nützliche Informationen über den Rechner anzeigen lassen. Meine Hardstatus-Zeile sieht so aus:
Um die Hardstatus-Zeile zu aktivieren muss man als erstes folgende Zeile in die .screenrc schreiben:
hardstatus alwayslastline
Was in der Zeile angezeigt werden soll, wird in der nächsten Zeile mit dem folgenden Befehl angegeben:
hardstatus string '...'
Wenn man in der Hardstatus-Zeile mehr als nur Hostname, Load oder Datum anzeigen lassen will, muss man eigene Scripte schreiben, die die gewünschten Informationen bereitstellen. In meinem Fall wird noch die Arbeitsspeicherauslastung, die Swap-Auslastung und die angemeldeten Benutzer angezeigt. Für die Arbeitsspeicherauslastung ist folgendes Script zuständig:
#!/bin/bash
free -m | grep Mem | awk '{print $3 "MB ("($3/$2)*100"%)"}'
Es gibt den belegten Arbeitsspeicher in MB an und die Belegung in Prozent. Das Script kann in einem Ordner im Home-Verzeichnis gespeichert werden, zum Beispiel /home/elm/.screen/mem.sh In die .screenrc muss man das Script dann mit backtick einbinden. Dazu wird folgender Eintrag in die .screenrc geschrieben:
backtick 1 10 10 /home/elm/.screen/mem.sh
Die 1 ist dabei die ID mit der man die Ausgabe des Scripts abfragen kann. Die erste 10 steht für die Gültigkeitsdauer der Ausgabe in Sekunden und die zweite 10 gibt an, nach wie vielen Sekunden das Script erneut aufgerufen werden soll.
Das Script für die Swap-Auslastung ist folgendes:
#!/bin/bash
free -m | grep Swap | awk '{print $3 "MB (" $3*100/$2 "%)"}'
mit folgendem Eintrag in der .screenrc:
backtick 2 10 10 /home/elm/.screen/swap.sh
Entsprechend für die Anzeige der angemeldeten Benutzer:
#!/bin/bash users | tr " " "\n" | sort -u | tr "\n" " " | sed -e 's/ /, /g;s/, $/\n/'
Diese Anzeige wird nur alle 30 Sekunden aktualisiert:
backtick 3 30 30 /home/elm/.screen/who.sh
Nun kommt die eigentliche Hardstatus-Zeile. Als erstes werden alle Einstellungen zurückgesetzt und der Hintergrund auf Schwarz und die Standardtextfarbe auf helles Grün gestellt. Dazu trägt man folgendes in die hardwarestatus string Zeile ein:
hardstatus string '%{= kG}'
Als nächstes kommt %H für den Hostname und die Farbe des Doppelpunktes soll danach helles Weiß (%{W}) sein:
hardstatus string '%{= kG}%H%{W}: '
Danach wird das erste eigene Script aufgerufen, dass die aktuelle Arbeitsspeicherauslastung in Gelb anzeigen soll:
hardstatus string '%{= kG}%H%{W}: %{y}%1`'
Das Hochkomma bedeutet, dass es sich bei %1 um die Ausgabe den backtick-Aufrufs mit der ID 1 handelt.
Als nächstes kommt ein Weißer Strich und die Belegung des Swap in Gelb:
hardstatus string '%{= kG}%H%{W}: %{y}%1`%{W}|%{y}%2`'
Die Anzeige der Tabs soll in der Zeile zentriert erscheinen. Dazu muss nun ein dynamischer Freiraum (%= ) eingefügt werden. Dieser passt sich immer so an, dass aller freier Platz belegt wird. Wird so ein Freiraum zweimal eingefügt, dann wird der freie Platzt zwischen beiden aufgeteilt.
hardstatus string '%{= kG}%H%{W}: %{y}%1`%{W}|%{y}%2`%='
Nun sollen alle Tabs angezeigt werden, die vor dem aktuell aktiven Tab liegen. Mit -w werden alle Tabs vor dem aktuellen angezeigt. Das L vor dem w bewirkt, dass zusätlich zu der Nummer und dem Namen des Tabs auch noch die Attribute des Tabs angezeigt werden. Das gleiche gilt für die Tabs, die nach dem aktuellen kommen, nur anstelle des - wird ein + verwendet. Das Ergebnis in Weiß:
hardstatus string '%{= kG}%H%{W}: %{y}%1`%{W}|%{y}%2`%=%{w}%-Lw...%{w}%+Lw'
Nun fehlt noch der aktuelle Tab. Dieser soll in Rot angezeigt werden. Die Nummer des Tabs bekommt man mit %n, die Flags mit %f und den Namen mit %t. Zwischen der Nummer und den Flags soll außerdem noch einen * stehen.
hardstatus string '%{= kG}%H%{W}: %{y}%1`%{W}|%{y}%2`%=%{w}%-Lw%{r}%n*%f%t%{w}%+Lw'
Nun kommt der zweite Freiraum, der dafür sorgt, dass die Tabs in der Mitte stehen:
hardstatus string '%{= kG}%H%{W}: %{y}%1`%{W}|%{y}%2`%=%{w}%-Lw%{r}%n*%f%t%{w}%+Lw%='
Jetzt kommt in hellem Grün das Wort User dann ein weißer Doppelpunkt und in Gelb die angemeldeten User:
hardstatus string '%{= kG}%H%{W}: %{y}%1`%{W}|%{y}%2`%=%{w}%-Lw%{r}%n*%f%t%{w}%+Lw%=%{G}User%{W}: %{y}%3`'
Zuletzt noch das Datum und die aktuelle Uhrzeit:
hardstatus string '%{= kG}%H%{W}: %{y}%1`%{W}|%{y}%2`%=%{w}%-Lw%{r}%n*%f%t%{w}%+Lw%=%{G}User%{W}: %{y}%3` %{B}%d.%m.%Y %{W}%c:%s'
Damit ist die Hardstatus-Zeile fertig.
Meine ganze .screenrc sieht damit so aus:
vbell off
termcapinfo xterm* ti@:te@
backtick 1 10 10 /home/elm/.screen/mem.sh
backtick 2 10 10 /home/elm/.screen/swap.sh
backtick 3 30 30 /home/elm/.screen/who.sh
hardstatus alwayslastline
hardstatus string '%{= kG}%H%{W}: %{y}%1`%{W}|%{y}%2`%=%{w}%-Lw%{r}%n*%f%t%{w}%+Lw%=%{G}User%{W}: %{y}%3` %{B}%d.%m.%Y %{W}%c:%s'
02.04.2011
11:14
R. Henze ¶
Sehr schöne Einführung!
Aber das mit den Formatierungsstring in einer exra Zeile hat bei mir (Ubuntu Karmic Koala) nicht geklappt.
Stattdessen habe ich alles in eine Zeile geschrieben:
hardstatus alwayslastline ‘%{= kG} …
02.04.2012
12:59
MST ¶
Hallo,
danke eine sehr schöne Erklärung.
Hat mir sehr geholfen.