Prozesse nach dem Abmelden ausführen
Manchmal müssen Sie einen Prozess weiterlaufen lassen, auch nachdem Sie sich vom Terminal abgemeldet haben. Der Befehl nohup ermöglicht es Ihnen, einen Befehl auszuführen, der auch nach dem Beenden der Shell weiterläuft.
Erstellen wir ein Skript, das lange läuft:
cd ~/project
nano persistent-task.sh
Fügen Sie den folgenden Inhalt hinzu:
#!/bin/bash
## This script runs for a very long time
echo "Starting persistent task at $(date)" > persistent-output.log
for i in {1..100}; do
echo "Iteration $i at $(date)" >> persistent-output.log
sleep 10
done
echo "Persistent task completed at $(date)" >> persistent-output.log
Speichern und beenden Sie nano und machen Sie das Skript dann ausführbar:
chmod +x persistent-task.sh
Führen Sie es nun mit nohup aus und stellen Sie es in den Hintergrund:
nohup ./persistent-task.sh &
Sie sehen eine Ausgabe ähnlich der folgenden:
[1] 5678
nohup: ignoring input and appending output to 'nohup.out'
Das bedeutet, dass der Prozess im Hintergrund läuft und auch nach Ihrer Abmeldung weiterläuft. Ausgaben, die normalerweise im Terminal erscheinen würden, werden in eine Datei namens nohup.out umgeleitet.
Tipp zur Verwaltung der Ausgabe: Wenn Sie nicht möchten, dass die Ausgabe des Hintergrundprozesses in Ihrem Terminal erscheint und Ihre Arbeit stört, können Sie die Ausgabe in eine Datei umleiten:
## Ausgabe in eine bestimmte Datei umleiten
./long-task.sh > task-output.log 2>&1 &
## Oder nach /dev/null umleiten, um die Ausgabe vollständig zu verwerfen
./long-task.sh > /dev/null 2>&1 &
Das 2>&1 leitet sowohl die Standardausgabe als auch die Fehlerausgabe um. Auf diese Weise läuft der Hintergrundprozess leise, ohne Ihr Terminal zu überladen.
Sie können überprüfen, ob der Prozess läuft:
ps aux | grep persistent-task.sh
Und Sie können die Ausgabedatei untersuchen:
cat persistent-output.log
Die Ausgabe zeigt die Startzeit und die Iterationen der persistenten Aufgabe.
Der Befehl disown
Eine weitere Möglichkeit, Prozesse nach der Abmeldung weiterlaufen zu lassen, ist die Verwendung des Befehls disown. Führen Sie zuerst einen Prozess im Hintergrund aus:
cd ~/project
./persistent-task.sh &
Verwenden Sie dann disown, um ihn vom Terminal zu trennen:
disown %1
Nun wird dieser Prozess weiter ausgeführt, auch wenn Sie das Terminal schließen.
Diese Befehle sind unerlässlich, wenn Sie Aufgaben auf Remote-Servern ausführen, bei denen Prozesse nach dem Trennen weiterlaufen müssen.