Kurzvorstellung des Programms GNU screen

Vorwort

Wir haben in der LUG beschlossen, uns immer mal interessante Programme vorzustellen. Das heißt, es soll kurz auf die Bedienung und evtl. wichtige Einstellungen eingegangen werden. Da in letzter Zeit immer mal wieder Fragen zu GNU screen aufkamen, beschloss ich, dass ich dieses Programm vorstelle. Diese Anleitung ist das Ergebnis.

Was macht screen?

GNU screen ist ein "Fenstermanager" für Terminals. Das heißt die Aufgaben, die ihr bislang unter mehrere Konsolen oder Terminals erledigt habt, könnt ihr mittels screen innerhalb einer Konsole bzw. Terminal machen. Wenn ihr eine Sitzung offen habt und den Rechner wechseln wollt, ist es mit screen sehr einfach möglich, die laufende Sitzung von der Konsole zu lösen und diese auf den anderen Rechner "mitzunehmen". Dabei laufen alle Prozesse, die innerhalb von screen gestartet wurden, weiter.

Start von GNU screen

Das Programm wird durch den Aufruf screen gestartet. Dabei erscheint in der Regel eine Übersicht mit der Versionnummer und Lizenzinformationen. Mit einem Druck auf die Leer- oder Entertaste wird dieses übersprungen. Ihr könnt auch dies auch dauerhaft ausschalten. Dazu öffnt ihr euren Lieblingseditor und bearbeitet die Datei .screenrc im Heimverzeichnis. Dort werden alle Einstellungen für screen gespeichert. In der Datei tragt ihr die Zeile startup_message off ein und speichert diese ab. Beim nächsten Start von screen erscheint dann keine Meldung mehr.

Nach der esten Meldung solltet ihr nun eine Shell sehen. Hier könnt ihr nun wie gewohnt arbeiten und die üblichen Aufgaben erledigen. Doch dies stellt natürlich keinen Unterschied zur sonst üblichen Arbeitsweise auf der Shell dar. Jetzt wollen wir versuchen, eine zweite Shell zo öffnen. Dieses Anliegen muss screen mitgeteilt werden. Befehle werden dabei in Form von Tastenkürzeln eingegeben. Bei screen wird jeder Befehl mit der Folge Strg+a eingeleitet, d.h. ihr drückt die Taste Strg und die Taste a gleichzeitig. Jetzt weiß screen, dass ein Befehl folgt. Um nun ein neues Shellfenster zu öffnen, drückt also die Tasten Strg+a c, d.h. wieder Strg und a zusammen und danach ein kleines c. Nun sollte sich ein neues Shellfenster geöffnet haben. Auch dieses kann nun wie gewohnt benutzt werden. Ich empfehle euch, ein paar mal zu testen, wie man ein neues Fenster öffnet. Dadurch werdet ihr die Tastenkombinationen besser gewohnt.

Wechsel der Fenster

Wenn ihr nun etwas herumgespielt habt, werdet ihr sicher viele einzelne Shells offen haben. Doch wie bekommt ihr diese wieder zu bzw. wie könnt ihr zu vorherigen Fenstern zurück kommen? Der klassiche Weg, die laufende Shell zu beenden, indem man exit, bye oder Strg+d eingibt, funktioniert auch hier. Dadurch wird die laufende Shell beendet und wenn man das oft genug macht, kommt man auch wieder zu der gewüschten Shell. Natülich ist dies nicht unbedingt der richtige Weg. Denn i.d.R. will man die Shells nicht einfach beenden. Wie also kommt man nun auf anderem Wege weiter? Bei solchen Fragen kann zunächst die Hilfe konsultiert werden. Mit Strg+a ? erreicht ihr eine Übersicht der bestehenden Tastaturkürzel. Immer wenn ihr mal einen Punkt erreicht, an dem ihr nicht wisst, wie es weitergeht, empfiehlt sich ein Blick in die Hilfe. Hier finden sich nun diverse Hinweise auf den Fensterwechsel. Eine erste Idee wäre mittels Strg+a w eine Ansicht der Fenster anzeigen zu lassen. Dies veranlasst screen in der untersten Leiste alle Unterfenster mit der Nummer des Fensters zu drucken. Das aktuelle Fenster wird dabei mit einem Stern gekennzeichnet. In der Hilfe ist weiterhin zu sehen, dass u.a. mittels Strg+a n auf das nächste Fenster bzw. mittels Strg+a p zum vorhergehenden Fenster navigiert werden kann. Für den Sprung zum nächsten Fenster bietet sich meiner Meinung auch Strg+a Leertaste an.

Gerade bei einer großen Zahl von Fenstern kann es aber recht müsam sein, durch alle Fenster zu rotieren. Daher existieren hier noch bessere Varianten. In der Ansicht, die ihr mittels Strg+a w erhaltet, sind auch die Nummern der Fenster angedruckt. Auf diese könnt ihr einfach mittels Strg+a $FENSTERNUMMER zugreifen. Dabei steht FENSTERNUMMER für eine Zahl zwischen 0 und 9. So springt screen schnell zwischen den ersten zehn Fenstern hin und her. Ich empfehle euch, auch dies wieder oft zu probieren und zu nutzen. Denn je mehr ihr das macht, desto schneller tritt der Gewöhnungseffekt ein.

Sollte euer screen nun mehr als zehn Fenster haben, ist es nicht mehr so einfach möglich in die hinteren Fenster zu springen. Unter Umständen hilft euch hier die Fensterliste weiter. Diese Ansicht erhaltet ihr durch Strg+a ". Mit den Pfeiltasten wählt ihr dann ein Fenster aus und mittels Enter springt ihr in das gewählte Fenster. Ein spezielles Fenster kann auch durch Strg+a ' und die Eingabe der jeweiligen Nummer angesprungen werden.

Hin und wieder habe ich in einem Fenster einen vim geöffnet und schreibe ein Programm. Daneben brauche ich ein anderes Fenster, um das Programm zu kompilieren. Dabei liegen die Fenster nicht notwendigerweise nebeneinander. Ein Springen zwischen diesen zwei Fenstern ist mittels Strg+a Strg+a einfach machbar.

Fenstertitel

Wenn ihr nun viel mit screen arbeitet, werdet ihr feststellen, dass ihr bei den oben genannten Informationen immer nur den Namen der Shell seht. Aber vielleicht ist in Wirklichkeit ein Editor offen oder eine Shell arbeitet einen speziellen Job ab. Da ist es sehr nützlich, dem entsprechenden Fenster auch einen Namen zu vergeben. Mit der Tastaturkombination Strg+a A (Beachte das große A) kann man den Namen ändern. So könnt ihr einen Titel für setzen, der euch am besten passt.

Änderungen verfolgen

Beim Arbeiten mit diversen Prozessen treten hin und wieder Aufgaben auf, für deren Abarbeitung die Shell lange Zeit benötigt. Mit screen kann dies nun problemlos in einem eigenen Fenster gemacht werden und weiterhin kann screen euch darauf aufmerksam machen, wenn sich im betreffenden Fenster etwas ändert. Dazu müsst ihr das Programm mittels Strg+a M anweisen, das Fenster zu überwachen. Nun werdet ihr über die Änderungen informiert. Standardmäßig schreibt screen in die unterste Statuszeile dann Activity in window X (X steht für die Nummer des Fensters.). Diese Standardmeldung lässt sich über die Variable activity in der .screenrc anpassen (z.B.: activity "ACHTUNG, in Fenster %n (%t) ist etwas passiert").

Abhängen einer Sitzung

Nach getaner Arbeit wollt ihr nun euren Platz verlassen. In der Regel würdet ihr den Bildschirm mittels xlock o.ä. sperren. Gerade wenn der Rechner aber von mehreren Personen benutzt wird, ist es besser, diesen freizugeben. Wie ich schon schrieb, kann ich eine screen-Sitzung vom laufenden Terminal abhängen. Zum Abhängen der Sitzung reicht die Kombination Strg+a d. Jetzt seht ihr wieder einen "normalen" Shellprompt vor euch und könntet euch nun vom System ausloggen oder hier weiterarbeiten. Wenn ihr von vornherein wisst, dass ihr euch ausloggen wollt, steht auch eine weitere nützliche Tastaturkombination zur Verfügung. Nämlich der so genannte Power detach. Mittels Strg+a DD wird die screen-Sitzung vom Terminal abgehangen und gleichzeitig erfolgt das Logout. Damit ist es möglich zwei Schritte mit einmal zu tun.

Wenn ihr dann wieder zum Rechner zurückkehrt bzw. euch vielleicht per SSH auf dem Rechner einloggt, wollt ihr die screen-Sitzung wieder aufnehmen. Dazu gebt ihr auf der Konsole einfach den Befehl screen -r ein. Bei einer eindeutigen Zuordnung öffnet screen die alte Sitzung an dem Punkt, an dem sie von euch geschlossen wurde. Solltet ihr mehrere abgehangene Sitzungen haben, zeigt screen euch eine Übersicht:

jens@paradise:~/ > screen -r
There are screens on:
        4172.tty2.paradise      (Detached)
        10711.tty3.paradise     (Detached)
2 Sockets in /var/run/screen/S-jens.
jens@paradise:~/ >

In dem Falle muss screen noch der Name der betreffenden screen-Sitzung mitgegeben werden. Die obige Übersicht wird auch mittels screen -ls angezeigt. So könnt ihr leicht erkennen, welche screen-Sitzungen es derzeit noch gibt.

Manchmal ist es auch ganz sinnvoll, der Sitzung selbst einen Namen zu geben. Dann erkennt ihr in der obigen Ansicht schneller, welche screen-Sitzung welche Aufgabe hat. Mit dem Befehl Strg+a :sessionname Sitzung1 erhält die laufende Sitzung den Namen "Sitzung1" und die Ausgabe von screen -ls ist dann:

There are screens on:
	4172.tty2.paradise	(Attached)
	10711.Sitzung1	(Detached)
2 Sockets in /var/run/screen/S-jens.

Jetzt wisst ihr u.U. schneller, welche der beiden Sitzungen die richtige ist.

Mit mehreren Nutzern arbeiten

Eines der weiteren beeindruckenden Eigenschaften von screen ist, dass verschiedene Leute in einer Sitzung arbeiten können. Falls ihr das selbst mal testen wollt, setzt zunächst die Konfigurationsvariable multiuser auf "on". Damit wird der Mehrnutzerbetrieb grundsätzlich möglich gemacht. Eine weitere Hürde ist das SUID-Bit. Damit ein anderer Benutzer die screen-Sitzung mit benutzen kann, muss screen das SUID-Bit tragen. Insbesondere unter Sicherheitsgesichtspunkten sollte daher genau überlegt werden, wie und ob das überhaupt gemacht werden soll. Ich würde die Datei /usr/bin/screen in eine neue Datei kopieren und nur der Kopie das SUID-Bit verleihen. Ein zusätzlicher Cronjob kann dann dafür sorgen, dass die Datei wieder gelöscht wird. Die genaue Verfahrensweise sollte aber von euch abhängen.

Wenn ihr die obigen Schritte vollzogen habt, könnt ihr dann Nutzerrechte innerhalb von screen vergeben. Mittels Strg+a :addacl screener weist ihr dem Nutzer screener das Recht zu, auf eure screen-Sitzung zuzugreifen. Der Nutzer darf dabei alles, was ihr auch dürft. Wenn ihr die Rechte einschränken wollt, müsst ihr mit chacl bzw. aclchg arbeiten. Eine genaue Beschreibung dieser Einstellung findet sich in der Manpage.

Bildschirm teilen

Das Programm screen kann auch den Bildschirm horizontal teilen. Die Tastaturkombination Strg+a S ist der Weg zum Ziel. Mittels Strg+a TAB wechselt screen zwischen den Bildschirmhälften. Die untere Hälfte ist zunächst leer. Wenn ihr den Cursor dort plaziert, könnt ihr einfach ein Fenster durch Strg+a $NUMMER (bzw. einen äquivalenten Befehl) wählen und schon wird dieses Fenster angezeigt. Mit Strg+a TAB springt der Cursor zwischen beiden Teilen hin und her. Wenn ihr dann beschliesst, dass doch ein großes Fenster reicht, gebt Strg+a Q ein und die Halbierung ist verschwunden.

Bildschirminhalte kopieren

Ein weiteres sehr nützliches Merkmal von screen ist das Kopieren von beliebigen Bildschirminhalten. Der Kopiermodus kann standardmäßig mit Strg+a [ aktiviert werden. Danach kann der Cursor mit ähnlichen Navigationskommandos wie im vi bewegt werden. In der Manpage zu screen findet sich eine detaillierte Aufstellung (Suche nach Movement keys). Nachdem der Startpunkt gefunden wurde, markiert ihr die zu kopierende Region mit der Leertaste und bewegt den Cursor bis zum Ende der zu kopierenden Region. Danach wieder ein Druck auf die Leertaste und der Inhalt wurde in einen Buffer kopiert. Dieser kann dann an anderer Stelle mittels Strg+a ] eingefügt werden.

Manchmal ist es auch vonnöten, einen Abzug des Bildschirms zu erstellen. Dies könnt ihr durch Strg+a h erreichen. Screen legt dann eine Datei hardcopy.0 an. Darin findet sich der Inhalt des Bildschirms und kann weiterverwendet werden.

Konfiguration

Wie ich bereits schrieb, wird die Konfiguration in der Datei .screenrc abgelegt. Screen ist eines der Programme, die sich durch eine Vielzahl an verschiedenen Konfigurationen sehr individuell steuern lassen. Aus meiner Sicht sind die einstellbaren Tastaturkombinationen recht interessant. Da ich Dateien gern mit dem Editor vim bearbeite, habe ich folgende Zeile in meine .screenrc aufgenommen: bind V screen -t EDIT vim. Dadurch kann ich mittels Strg+a V den vim aufrufen. Der Parameter -t sorgt dafür, dass das so aufgerufene Fenster noch einen entsprechenden Titel erhält. Auf diese Weise lassen sich diverse individuelle Tastaturkombinationen anlegen. Wer eine bereits voreingestellte wieder abschalten will, kann einfach bind H in die .screenrc aufnehmen. Damit verliert Strg+a H seine Bedeutung.

Wer an einer wackeligen Internetverbindung sitzt und daräber screen nutzt, wird die Einstellung autodetach on zu schätzen wissen. Dies sorgt dafür, dass beim Abbruch der Verbindung die screen-Sitzung automatisch abgehangen wird.

Oben schrieb ich, dass ihr durch Strg+a w eine Übersicht der bestehenden Fenster anzeigen lassen könnt. Diese Informationen lassen sich auch permament einblenden. Screen kennt dazu die Einstellungen caption und hardstatus. Beide können sehr individuelle Werte, von den aktien Fenstern über Zeit und Systemload bis hin zur Ausgabe von Skripten, anzeigen. Diese Ausgabe kann auch noch durch Vorder- und Hintergrundfarben verfeinert werden. Hier solltet ihr selbst mal ein wenig rumspielen, was alles möglich ist bzw. was euch hier am besten gefällt.

Weiterhin existieren noch sehr viele weitere Einstellungsmöglichkeiten. Diese würden jedoch den Umfang der Einführung sprengen. Ich empfehle euch, mal einen Blick in die Manpage zu werfen bzw. im Netz nach verschiedenen .screenrc-Dateien zu suchen. Gerade aus letzteren Könnt ihr euch einige Anregungen entnehmen.

Ich hoffe, ich habe euch ein wenig Appetit auf screen gemacht und ihr probiert das Programm bald selbst mal aus.