Eine Ode an GNU Screen

Screen ist ein Windows-Manager für die Arbeit mit dem Terminal in einer UNIX Umgebung. Screen erlaubst es dem Nutzer innerhalb einer Terminal Session mehrere Fenster zu öffnen und zwischen den Fenster wechseln zu können. Das klingt vielleicht erst mal etwas unspektakulär, bietet aber sehr viele Möglichkeit, um die Effizienz bei der täglichen Arbeit mit dem Terminal siginifikant zu steigern. Ich möchte dieses kleine unscheinbare Tool jedenfalls nicht mehr missen.

Screen ist Open Source und kostenlos und kann, fall es nicht vorinstalliert ist, über die üblichen Wege auf ein UNIX System installiert werden. Detaillierte Informationen gibt es hier.

Es handelt sich bei diesem Blog Eintrag explizit nicht um eine Anleitung, wie man mit Screen arbeiten kann. Dazu liest man sich am besten das Manual des Entwicklers durch. Ich möchte lediglich an einigen kurzen Ausfü hrungen aufzeigen, wie hilfreich dieses kleine Tool in der täglichen Arbeit mit dem Terminal sein kann.

Wichtige Befehle

Nachdem Screen installiert ist, kann es nach der Anmeldung auf dem Server durch folgenden Aufruf gestartet werden.

screen -U -S kostas

Dadurch wird eine Screen Session gestartet. Der Parameter U steht dabei für die Nutzung des UTF8 Encodings und mit dem Pameter S wird der Session ein Name zugeteilt, in dem Fall „kostas“. Später erkläre ich noch, warum das sinnvoll und hilfreich ist.

Nach Aufruf landet man im Prinzip da, wo man auch vorher war, nämlich im Terminal. Nur befindet man sich nun innerhalb der Screen Session. Hier hat man nun die Möglichkeit mehrere Fenster zu erstellen und zwischen diesen hin und her zu springen.

Zum Erstellen eines neuen Fensters muss folgender Befehl ausgeführt werden:

Ctrl + A + C (Mac)
Strg + A + C (Windows)

Zum Durchlaufen aller geöffneten Fenster ist folgender Befehl notwendig:

Ctrl + A + N (Mac)
Strg + A + N (Windows)

Zwischen zwei Fenstern hin und zurück wechseln:

Ctrl + A + A (Mac)
Strg + A + A (Windows)

Ein Fenster schließt und terminiert man, indem man exit eintippt.

Die Screen Session verlässt man mit folgendem Befehl:

Ctrl + A + D (Mac)
Strg + A + D (Windows)

Dadurch landet man wieder im „normalen“ Terminal, der sich optisch aber natürlich nicht unterscheidet. Schließlich benutzt Screen standardmäßig die gleiche Konfiguration.

Um nun wieder in die Screen Session einzusteigen, führt man Folgendes aus:

screen -xU -S kostas

Der Parameter steht dabei für „attach to session“, was im Prinzip bedeutet, dass man in die konkrete Session wieder einsteigt.

Dieser Befehl ist bei mir mittlerweile instinktiv immer der erste, den ich ausführe, sobald ich mich auf einen Server angemeldet habe.

Warum Screen?

Warum nun also Screen benutzen, wenn man dadurch keine zusätzlichen Funktionalitäten bekommt, sondern lediglich beliebig viele Terminal Fenster innerhalb einer Terminal Session öffnen kann.

Multi User Unterstützung

In der Regel ist es so, dass für die Anmeldung auf einen Server allen Entwicklern, Testern und Projektmanagern ein einziger Zugang zur Verfügung gestellt wird. Das ist grundsätzlich auch unproblematisch, aber der Komfort leidet ein wenig darunter. So findet man z.B. in der Befehlshistorie nicht nur eigene Einträge, sondern auch solche von Kollegen. Der Versuch, einen bereits eingegebenen Befehl durch Drücken der Pfeil-oben Taste wiederzufinden, kann sich unter Umständen als sehr mühsam erweisen.

Durch die Nutzung von Screen und einer Screen Session pro User kann dies vermieden werden.

Skripte laufen lassen

Oft ist es notwendig, ein Skript auf einem Server laufen zu lassen, das einige Stunden bis hin zu Tagen benötigt, um durchzulaufen. Das kann z.B. die Indizierung einer Datenbank für eine Solr Suche sein oder eine Anpassung an einem sehr großen Datenbestand oder aber auch ein Datenimport aus einer CSV Datei. Wenn man so ein Skript innerhalb einer Screen Session startet, dann hat man die Möglichkeit immer wieder in die Session einzusteigen, um den Fortschritt des Skriptes einzusehen und letztendlich auch zu schauen, wann das Skript durchgelaufen ist. Auch kann man das Skript leichter stoppen, da der Kontext des Skriptaufrufes nicht verloren gegangen ist. Bei der normalen Terminal Nutzung wäre das nur umständlich über das Finden des Prozesses anhand des Aufrufes und dem anschließenden Killen des Prozesses möglich.

Arbeit einfach fortsetzen

Der Zustand in den einzelnen Fenstern einer Screen Session wird beim Verlassen dieser abgespeichert. Das bedeutet, dass beim Wiederaufruf der Session drei wesentliche Dinge nicht verloren gegangen sind:

  1. der Ordner, in dem ich mich befunden habe,
  2. der User, den ich verwendet habe und
  3. die Befehle, die ich eingegeben habe.

Und das pro Fenster. Sobald ich also die Screen Session fortzetze, kann ich an den letzten Zustand anknüpfen und meine Arbeit ohne Latenzen fortführen.

Beispiel:

Für ein Projekt muss ich mich auf einen Server anmelden, um dort einige Arbeiten auszuführen.
Ich muss zunächst mit dem Standard SSH User ein Template bearbeiten. Dazu öffne ich ein Fenster und begebe mich zu dem Ordner, wo sich das Template befindet und bearbeite es, z.B. mit dem vim Editor (ja, das Projekt hat weder eine Software zur Versionskontrolle noch ein automatisiertes Deployment 🙂 ).
Damit die Änderungen im Browser sichtbar werden, muss ich den Cache leeren. Dazu öffne ich ein zweites Fenster, wo ich zum www-data User wechsle, da die Cache Dateien in der Regel von diesem User erstellt und modifiziert werden. Ich begebe mich in den Web Ordner, wo ich dann den Befehl zum Cache leeren ausführe.
Zusätzlich muss ich aber noch eine Anpassung an der vhost Datei des Projekts machen, da ein zusätzlicher Domain Alias hinzugekommen ist. Dazu öffne ich ein drittes Fenster, wo ich zum root User wechsle und die Konfiguration vornehme.
Als würde das aber nicht reichen, kommt eine Nachricht, dass in einem anderen Projekt, das auf dem gleichen Server liegt, ein gravierender Bug entdeckt wurde. Ich öffne also ein viertes Fenster, in dem ich versuche den Fehler zu fixen.

Der tägliche Agenturwahnsinn also 🙂


Zum Glück war das Ganze mit einem einfachen Bugfix zu lösen. Das Projekt ist erst mal gerettet. Zurück zum Ursprungsprojekt also.

Bei all der Hektik, habe ich aber leider vergessen, mein Notebook an den Strom anzuschließen und habe leider nicht bemerkt, dass der Akku leer gelaufen ist. Der Rechner versetzt sich automatisch in den Ruhemodus. Schnell also Stecker rein und Rechner wieder anschalten.

Die Terminal Session ist natürlich verloren und ich wurde vom Server abgemeldet.
Hier kommt jetzt aber Screen ins Spiel. Durch Aufruf der letzten Screen Session öffnen sich alle vier Fenster. Und zwar im entsprechenden Ordner, mit dem entsprechenden User und mit der entsprechenden Befehlshistorie. In einem Fenster ist sogar noch der vim Editor geöffnet und ich kann meine Arbeit ohne jeglichen Zeitverlust direkt fortsetzen.

Puh, nochmal gut gegangen.

Kostas Strigkos

Lassen Sie uns mal sprechen.

In einem kurzen, kostenlosen Erstgespräch finden wir heraus, ob und wie ich Sie bei Ihrem Vorhaben unterstützen kann.