Linux Hintergrundprozesse

LinuxBeginner
Jetzt üben

Einführung

Linux bietet leistungsstarke Funktionen zur Prozessverwaltung, die es Benutzern ermöglichen, Befehle im Hintergrund auszuführen, während sie weiterhin im Terminal arbeiten. Diese Funktionalität ist unerlässlich für zeitaufwändige Aufgaben, die keine ständige Überwachung erfordern. In diesem Lab lernen Sie, wie Sie Prozesse im Hintergrund ausführen, deren Status überprüfen und sie effektiv verwalten. Diese Fähigkeiten sind für jeden Linux-Benutzer grundlegend und bieten mehr Flexibilität bei der Arbeit in Kommandozeilenumgebungen.

Verständnis von Hintergrundprozessen

In Linux können Prozesse entweder im Vordergrund oder im Hintergrund laufen. Ein Vordergrundprozess belegt Ihr Terminal, bis er abgeschlossen ist, und hindert Sie daran, andere Befehle auszuführen. Ein Hintergrundprozess hingegen läuft, ohne Ihr Terminal zu blockieren, und ermöglicht es Ihnen, die Kommandozeile weiterhin zu nutzen.

Erstellen wir zunächst ein einfaches Skript, das eine langlaufende Aufgabe simuliert. Dies wird uns helfen, Hintergrundprozesse zu demonstrieren.

Navigieren Sie zum Projektverzeichnis:

cd ~/project

Erstellen Sie eine Datei namens long-task.sh mit dem nano-Editor:

nano long-task.sh

Fügen Sie den folgenden Inhalt in die Datei ein:

#!/bin/bash
## This script simulates a long-running task
echo "Starting long task..."
for i in {1..20}; do
  echo "Processing step $i..."
  sleep 5
done
echo "Long task completed."

Drücken Sie Strg+O gefolgt von Enter, um die Datei zu speichern, und dann Strg+X, um nano zu beenden.

Machen Sie das Skript ausführbar, indem Sie seine Berechtigungen ändern:

chmod +x long-task.sh

Führen Sie das Skript nun im Vordergrund aus:

./long-task.sh

Sie werden sehen, wie das Skript jeden Schritt mit einer Verzögerung von 5 Sekunden ausgibt. Beachten Sie, dass Sie während dieser Zeit keine anderen Befehle im Terminal eingeben können, da der Prozess im Vordergrund läuft.

Drücken Sie Strg+C, um das Skript abzubrechen, bevor es abgeschlossen ist.

Prozesse im Hintergrund ausführen

Um einen Prozess im Hintergrund auszuführen, fügen Sie einfach ein kaufmännisches Und (&) am Ende des Befehls an. Dies weist die Shell an, den Befehl im Hintergrund auszuführen.

Lassen Sie uns unser Skript long-task.sh im Hintergrund ausführen:

cd ~/project
./long-task.sh &

Sie sollten eine Ausgabe ähnlich der folgenden sehen:

[1] 1234
Starting long task...
Processing step 1...

Hier ist [1] die von der Shell zugewiesene Jobnummer und 1234 die Prozess-ID (PID). Die Jobnummer wird verwendet, um diesen Hintergrundprozess innerhalb der Shell zu referenzieren, während die PID vom Betriebssystem zur Identifizierung des Prozesses verwendet wird.

Beachten Sie, dass Sie nach der anfänglichen Ausgabe Ihre Eingabeaufforderung zurückerhalten. Sie können nun weiterhin andere Befehle eingeben, während das Skript im Hintergrund läuft.

Versuchen Sie zum Beispiel, eine weitere Datei zu erstellen:

echo "I can do other work while the script runs" > background-demo.txt
cat background-demo.txt

Sie werden sehen, dass Sie im Terminal weiterarbeiten können, während Sie gelegentlich die Ausgabe des Hintergrundskripts sehen. Dies ist sehr nützlich, um zeitaufwändige Aufgaben auszuführen, ohne Ihre Terminal-Sitzung zu blockieren.

Wichtiger Hinweis: Es ist völlig normal, dass die Ausgabe des Hintergrundprozesses in Ihrem Terminal erscheint. Wenn Sie einen Prozess mit & im Hintergrund ausführen, wird der Prozess im Hintergrund ausgeführt, aber seine Ausgabeströme (stdout und stderr) sind immer noch mit Ihrem Terminal verbunden. Das bedeutet:

  • Der Prozess läuft im Hintergrund (Sie können andere Befehle eingeben)
  • Der Prozess wird weiterhin ausgeführt, ohne Ihr Terminal zu blockieren
  • Die Ausgabe erscheint weiterhin auf Ihrem Bildschirm (was sich mit Ihren anderen Befehlen vermischen kann)

Dieses Verhalten ist zu erwarten und zeigt, dass der Hintergrundprozess aktiv läuft und Ausgaben erzeugt.

Hintergrundprozesse prüfen

Linux bietet mehrere Befehle, um zu überprüfen, welche Prozesse im Hintergrund laufen. Die beiden gebräuchlichsten sind jobs und ps.

Verwendung des Befehls jobs

Der Befehl jobs zeigt den Status aller Hintergrundjobs in der aktuellen Shell-Sitzung an:

jobs

Sie sollten eine Ausgabe ähnlich der folgenden sehen:

[1]+  Running    ./long-task.sh &

Das +-Zeichen zeigt an, dass dies der aktuelle Standardjob ist, was bedeutet, dass er bearbeitet wird, wenn Sie Befehle wie fg oder bg verwenden, ohne eine Jobnummer anzugeben.

Verwendung des Befehls ps

Während jobs nur Prozesse anzeigt, die von der aktuellen Shell gestartet wurden, kann der Befehl ps alle auf dem System laufenden Prozesse anzeigen:

ps aux | grep long-task.sh

Die Ausgabe sollte eine Zeile für Ihr Hintergrundskript enthalten:

labex     1234  0.0  0.0   4508  1996 pts/0    S    12:34   0:00 /bin/bash ./long-task.sh

Erstellen wir einen weiteren Hintergrundprozess, damit wir mehrere Jobs sehen können:

cd ~/project
nano another-task.sh

Fügen Sie den folgenden Inhalt hinzu:

#!/bin/bash
## This script simulates another task
echo "Starting another task..."
for i in {1..20}; do
  echo "Another task - step $i..."
  sleep 5
done
echo "Another task completed."

Speichern und beenden Sie nano (Strg+O, Enter, Strg+X) und machen Sie das Skript dann ausführbar:

chmod +x another-task.sh

Führen Sie auch dieses Skript im Hintergrund aus:

./another-task.sh &

Überprüfen Sie nun erneut Ihre Hintergrundjobs:

jobs

Sie sollten beide Jobs aufgelistet sehen:

[1]-  Running    ./long-task.sh &
[2]+  Running    ./another-task.sh &

Hintergrundprozesse verwalten

Nachdem wir nun Prozesse im Hintergrund laufen haben, lernen wir, wie wir sie verwalten können. Linux bietet mehrere Befehle zur Steuerung von Hintergrundprozessen:

Einen Hintergrundprozess in den Vordergrund holen

Der Befehl fg holt einen Hintergrundprozess in den Vordergrund. Wenn Sie mehrere Hintergrundjobs haben, können Sie angeben, welchen Sie mit seiner Jobnummer verwenden möchten.

Holen wir unseren ersten Job in den Vordergrund:

fg %1

Das %1 bezieht sich auf die Jobnummer 1. Sie sehen nun die Ausgabe des Skripts long-task.sh in Ihrem Terminal, und Ihre Eingabeaufforderung ist nicht verfügbar, bis der Prozess abgeschlossen ist oder Sie ihn stoppen.

Um den Prozess zu unterbrechen und zur Eingabeaufforderung zurückzukehren, drücken Sie Strg+C.

Einen Vordergrundprozess in den Hintergrund senden

Sie können auch einen Vordergrundprozess in den Hintergrund senden. Unterbrechen Sie zuerst den Vordergrundprozess mit Strg+Z und verwenden Sie dann den Befehl bg, um ihn im Hintergrund fortzusetzen.

Starten Sie einen neuen Vordergrundprozess:

cd ~/project
./long-task.sh

Drücken Sie nach einigen Sekunden Strg+Z, um den Prozess anzuhalten. Sie sehen eine Meldung wie:

[1]+  Stopped    ./long-task.sh

Setzen Sie ihn nun im Hintergrund fort:

bg

Der Prozess wird im Hintergrund weiter ausgeführt, und Sie sehen:

[1]+ ./long-task.sh &

Sie können mit folgendem Befehl überprüfen, ob er läuft:

jobs

Sie sollten sehen, dass beide Jobs aufgelistet sind:

[1]+  Terminated    ./long-task.sh

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.

Zusammenfassung

In diesem Lab haben Sie wesentliche Linux-Kenntnisse zur Verwaltung von Hintergrundprozessen erlernt. Sie haben geübt:

  1. Erstellen und Ausführen von Skripten sowohl im Vordergrund- als auch im Hintergrundmodus
  2. Ausführen von Prozessen im Hintergrund mit dem Operator &
  3. Überprüfen des Status von Hintergrundprozessen mit jobs und ps
  4. Verwalten von Prozessen mit den Befehlen fg und bg, um sie zwischen Vorder- und Hintergrund zu verschieben
  5. Beenden von Hintergrundprozessen mit dem Befehl kill
  6. Ausführen von Prozessen, die nach dem Abmelden weiterlaufen, mit nohup und disown

Diese Fähigkeiten sind grundlegend für effizientes Arbeiten in Linux-Umgebungen, insbesondere bei langlaufenden Aufgaben oder bei der Arbeit auf Remote-Servern. Durch das Ausführen von Prozessen im Hintergrund können Sie Ihre Produktivität maximieren, indem Sie mehrere Aufgaben gleichzeitig ausführen, ohne Ihre Terminal-Sitzung zu blockieren.