Ein Linux Kommando im Hintergrund ausführen

(Last Updated On: 7. Dezember 2014)

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.

 

 

Andreas Loibl ist SAP-Berater, Ethical Hacker und Online Marketing Manager und schreibt auf seinem Blog DaFRK Blog über verschiedene Themen in den Sektoren Projektmanagement, Informationstechnik, Persönlichkeitsentwicklung, Finanzen und Zeitmanagement.

DaFRK

Andreas Loibl ist SAP-Berater, Ethical Hacker und Online Marketing Manager und schreibt auf seinem Blog DaFRK Blog über verschiedene Themen in den Sektoren Projektmanagement, Informationstechnik, Persönlichkeitsentwicklung, Finanzen und Zeitmanagement.

Das könnte Dich auch interessieren …

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.