Die Möglichkeit, ein Linux Kommando im hintergrund auszufürhen ist beispielsweise dann sehr nützlich, wenn man sich per SSH von einem Desktoprechner aus auf einen Server eingeloggt hat und ein Kommando ausführt, welches mehrere Tage oder über Nacht dauert. Würde der Desktoprechner zwischendrin herunterfahren oder die Internetverbindung unterbrochen, würde das Kommando eventuell abbrechen. Wenn man das Kommando hingegen in den hintergrudnd schickt, kann man den Desktoprechner herunterfahren und sich den aktuellen Status des Prozesses wieder hervorholen.
Man kann Linux Kommandos im Hintergrund ausführen lassen, wenn man an das Kommando ein &-Zeichen anhängt. das Kommando wird dann als sogenannter job ausgeführt. Den Job kann man sich dann jederzeit wieder auf die Kommandozeile holen – auch wenn man die SSH Session, unter der man das Kommando ausgeführt hat, beendet und eine neue aufgebaut hat.
Im folgenden Beispiel werde ich eine unison-Synchronisation in den hintergrund verschieben
unison server1 -batch &
das Kommando wird jetzt als Job ausgeführt. Um zu sehen, welche Job-ID der Joib hat, geben wir ein
jobs -l
Wenn wir jetzt den Job auf einer neuen SSH Session wieder in den Vordergrund holen wollen, geben wir ein
fg job_nummer
Das Problem ist, bisher wird der job zwar im Hintergrund gestartet, aber sobald wir die Shell-Sitzung beenden, wird auch der Job beendet. wir können das Kommando also noch nicht shell-unabhängig starten lassen. Damit das funktioniert, brauchen wir die binary nohup. Wir können prüfen, ob das Tool bereits installiert ist mit
which nohup
Sollte das tool noch nicht installiert sein, kann man es über eine Paketverwlatung nachinstallieren. Häufig heißt das zugehörige Paket coreutils.
Um nun einen Befehl sitzungsunabhängig im Hintergrund laufen zu lassen, geben wir ein
nohup <Befehlszeile> &
Ihr solltet jetzt die Funktoipnalität von nohup in eurem konkreten Fall ausprobieren. starte ein kommando mit nohup, meldet euch von der sitzung ab und versucht, das Programm mit fg wieder in den Vordergrund zu holen.
Es kann sein, dass eure spezielle Zeile mit dem nohup-Kommando nicht wieder aufgenommen werdne kann. In diesem Fall müsst ihr euch der Alternative screen bedienen
screen – die Alternative
Screen ist ebenfalls ein binary, mit dem man eine Befehlszeile sitzungsunabhängig im Hintergrund ausführen kann. Der Unterschied: Screen führt nicht einfach die Befehlsziele im Hintergrund als ÄJob aus, sondern speichert die gesamte Sitzung inklusive geladener Bilbiotheken, Aliase, Umgebungsvariablen und Userdaten. Das kann bei einigen Tools der ausschlagebende Faktor sein, um es im Hintergrund ausführen und iweder aufnehmen zu können. Vielleicht sind Sie an gesetzte Umgebungsvariablen oder Zeilen in der .bashrc oder .profile eines Users gebunden, die sie in einem Shell-Skript ansonsten nicht aufrufen könnten. Mit screen geht das!
Testen ob installiert
which screen
Da Screen installiert ist, wollen wir screen nun erstmal starten. Das geht ganz einfach:
screen
Jetzt läuft screen als Prozess im Hintergrund und wir können die bestehende Sitzung mit screen speichern lkassen.Dazu müssen wir erst eine neue Sitzung starten. Das machen wir mit dem -S Flag. Wir müssen der sitzung dazu noch einen Namen geben.
screen -S <Sitzungsname unter dem die sitzung gespeichert wird> beispiel: screen -S sitzung1
Die Sitzung wird erstellt und gleichzeitig unter dem Namen sitzung1 gespeichert. Jetzt wollen wir testhalber mal die Verbindung zu unserer Sitzung abbrechen. Das geht mit der Tastenkombination Strg+A+D. Nachdem das gemacht ist, wollen wir die Verbindung zur Sitzung wiederaufnehmen. Das geht mittels _Flag -r
screen -r <Sitzungsname unter dem die Sitzung gespeichert wurde> Beispiel screen -r sitzung1
Der Schalter -R versucht, sich zu einer bestehenden Verbindung mit dem Namen sitzung1 zu verbinden. Falls keine solche Sitzung besteht, erstellt er die Sitzung 1 neu. Das ist oft sinnvoll in irgendwelchen Skripten.
Es kann mal vorkommen, dass wir eine Sitzung erstellen und sie wiederuafnehmen wollen, aber ihren Namen vergessen haben. Das ist kein Problem. wir können uns eine Liste aller laufenden Sitzungen anzeigen lassen mittels
screen -ls
es kommt manchmal vor, dass man eine Sitzung begonnen hat, aber die Verbindung nicht trennen konnte, da die SSH Verbinudng abgerissen ist. Die Sitzung wird dadurch aber nicht gekillt, sondern läuft weiter. Wenn wir sie aber nun auf einem anderen Rechner wiederherstellen wollen, müssen wir Sie erst von der alten SSh-Session trennen. Das geht auf der neuen SSH-Session mit dem kommando screen-d
screen -d <Sitzungsname der Sitzung, die getrennt werden soll> beispeil screen -d sitzung1
wir können eine Sitzung auf mehreren Rechnern gleichzeitig wiederaufnahemen, wenn wir sie jedesmal mit dem Flag -x aufrufen
screen -rx sitzung1
Wir können jetzt entweder eiune Sitzung erstellen, unsere Befehlszeile dann manuell ausführen lassen und die Sitzung danach trennen – sie wird im Hintergrund ausgeführt. Oder wir erstellen eine sitzung und geben dieser gleich ein Kommando hinterher. Das geht mit dem Flag -X
screen -S <Name der Sitzung> -X <Optionen des X-Flags> $'<Befehlszeile>' Beispiel: screen -S sitzung1 -X hardstatus $
Wenn man Screen Sitzungen innerhalb eines Shell-Skripts erstellen will, macht es Sinn, beim Anlegen der Sitzung eine eventuell zuvor bestehende Sitzung mit gleichem Namen aus einem vorhergehenden Turnus des Skripts zu beenden. Deswegen sieht man in Skripten oft die Zeile
screen -dmS <sitzungsname>
Dies trennt eine alte Sitzung und erstellt dann eine neue. Der Parameter -m ist dabei ebenfalls nützlich, da er eine Variable ignoriert, die ebenfalls zur Weideraufnahme einer Sitzung führen könnte. Achtung: diesen Effekt kann man nicht mit screen -R herbeiführen, da dieser nur dann eine neue Sitzung aufbaut, wenn keine bestehende Sitzung diesen Nmanes existiert!
Wenn Sie screen in Shell-Skripten verwenden möchten, wollen Sie vielleicht, dass Screen bie jedem Anmelden automatisch gestarett wird.
Wenn dir dieser Post gefallen hat, teile ihn doch auf Social Media, abonniere und verfolge mich per E-Mail, RSS-Feed, Social Media oder registriere dich auf meiner Seite. Wenn du registriert bist, like den Post bitte, wenn er dir gefallen hat!