Linux Hintergrundausführung

LinuxLinuxBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

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

Grundlagen zu Hintergrundprozessen

In Linux können Prozesse entweder im Vordergrund oder im Hintergrund laufen. Ein Vordergrundprozess belegt Ihr Terminal, bis er abgeschlossen ist, und verhindert dadurch, dass Sie andere Befehle ausführen können. Ein Hintergrundprozess hingegen läuft, ohne Ihr Terminal zu blockieren, sodass Sie weiterhin die Befehlszeile nutzen können.

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

Navigieren Sie in das Projektverzeichnis:

cd ~/project

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

nano long-task.sh

Fügen Sie der Datei den folgenden Inhalt hinzu:

#!/bin/bash
## Dieses Skript simuliert eine langlaufende Aufgabe
echo "Starting long task..."
for i in {1..10}; do
  echo "Processing step $i..."
  sleep 3
done
echo "Long task completed."

Drücken Sie Strg+O und anschließend Enter, um die Datei zu speichern, und dann Strg+X, um nano zu verlassen.

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

chmod +x long-task.sh

Führen Sie nun das Skript im Vordergrund aus:

./long-task.sh

Sie werden sehen, dass das Skript jeden Schritt mit einer Verzögerung von 3 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 vor Abschluss zu beenden.

Ausführen von Prozessen im Hintergrund

Um einen Prozess im Hintergrund auszuführen, fügen Sie einfach ein Ampersand (&) am Ende des Befehls hinzu. Dadurch wird der Shell mitgeteilt, dass der Befehl im Hintergrund ausgeführt werden soll.

Lassen Sie uns unser long-task.sh-Skript 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...

Hierbei ist [1] die von der Shell zugewiesene Job-Nummer und 1234 die Prozess-ID (PID). Die Job-Nummer wird verwendet, um sich innerhalb der Shell auf diesen Hintergrundprozess zu beziehen, während die PID vom Betriebssystem verwendet wird, um den Prozess zu identifizieren.

Beachten Sie, dass Sie nach der ersten Ausgabe wieder die Befehlseingabeaufforderung erhalten. Sie können nun weiterhin andere Befehle eingeben, während das Skript im Hintergrund läuft.

Beispielsweise versuchen Sie, eine andere Datei zu erstellen:

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

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

Überprüfen von Hintergrundprozessen

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

Verwendung des jobs-Befehls

Der jobs-Befehl 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 gibt an, dass dies der aktuelle Standardjob ist. Das bedeutet, dass dieser Job bearbeitet wird, wenn Sie Befehle wie fg oder bg ohne Angabe einer Job-Nummer verwenden.

Verwendung des ps-Befehls

Während jobs nur die aus der aktuellen Shell gestarteten Prozesse anzeigt, kann der ps-Befehl 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

Lassen Sie uns einen weiteren Hintergrundprozess erstellen, 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 Sie die Datei und verlassen Sie nano (Strg+O, Enter, Strg+X), und machen Sie dann das Skript 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 aufgeführt sehen:

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

Verwaltung von Hintergrundprozessen

Nachdem wir nun Prozesse im Hintergrund laufen haben, lernen wir, wie wir diese verwalten können. Linux bietet mehrere Befehle, um Hintergrundprozesse zu steuern:

Bringt einen Hintergrundprozess in den Vordergrund

Der fg-Befehl bringt einen Hintergrundprozess in den Vordergrund. Wenn Sie mehrere Hintergrundjobs haben, können Sie angeben, welcher Job gemeint ist, indem Sie seine Job-Nummer verwenden.

Lassen Sie uns unseren ersten Job in den Vordergrund bringen:

fg %1

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

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

Senden eines Vordergrundprozesses in den Hintergrund

Sie können auch einen Vordergrundprozess in den Hintergrund senden. Stoppen Sie zunächst den Vordergrundprozess mit Strg+Z, und verwenden Sie dann den bg-Befehl, um ihn im Hintergrund fortzusetzen.

Starten Sie einen neuen Vordergrundprozess:

cd ~/project
./long-task.sh

Nach ein paar Sekunden drücken Sie Strg+Z, um den Prozess anzuhalten. Sie werden eine Meldung wie die folgende sehen:

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

Fortsetzen Sie ihn nun im Hintergrund:

bg

Der Prozess wird im Hintergrund fortgesetzt, und Sie werden sehen:

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

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

jobs

Beenden von Hintergrundprozessen

Um einen Hintergrundprozess zu beenden, können Sie den kill-Befehl mit der Job-Nummer oder der Prozess-ID verwenden:

kill %1

Oder unter Verwendung der PID (ersetzen Sie 1234 durch die tatsächliche PID aus Ihrer ps-Ausgabe):

kill 1234

Um zu überprüfen, ob der Prozess beendet wurde:

jobs

Sie könnten eine Meldung sehen, die angibt, dass der Job beendet wurde:

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

Ausführen von Prozessen nach dem Abmelden

Manchmal müssen Sie einen Prozess auch nach dem Abmelden vom Terminal weiterlaufen lassen. Der nohup-Befehl ermöglicht es Ihnen, einen Befehl auszuführen, der auch nach dem Beenden der Shell weiterläuft.

Lassen Sie uns ein Skript erstellen, 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 Sie die Datei und verlassen Sie nano, und machen Sie dann das Skript ausführbar:

chmod +x persistent-task.sh

Führen Sie es nun mit nohup aus und legen Sie es in den Hintergrund:

nohup ./persistent-task.sh &

Sie sollten eine Ausgabe ähnlich der folgenden sehen:

[1] 5678
nohup: ignoring input and appending output to 'nohup.out'

Das bedeutet, dass der Prozess im Hintergrund läuft und auch nach dem Abmelden weiterläuft. Die Ausgabe, die normalerweise in das Terminal geschrieben würde, wird in eine Datei namens nohup.out umgeleitet.

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 dauerhaften Aufgabe.

Der disown-Befehl

Eine andere Möglichkeit, Prozesse nach dem Abmelden weiterlaufen zu lassen, ist die Verwendung des disown-Befehls. Zunächst starten Sie einen Prozess im Hintergrund:

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

Verwenden Sie dann disown, um ihn vom Terminal zu trennen:

disown %1

Jetzt wird dieser Prozess auch nach dem Schließen des Terminals weiterlaufen.

Diese Befehle sind unerlässlich, wenn Sie Aufgaben auf Remote-Servern ausführen, bei denen Prozesse nach dem Trennen der Verbindung weiterlaufen müssen.

Zusammenfassung

In diesem Lab haben Sie essentielle Linux-Fähigkeiten zur Verwaltung von Hintergrundprozessen gelernt. Sie haben Folgendes 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 fg- und bg-Befehlen, um sie zwischen Vordergrund und Hintergrund zu verschieben
  5. Beenden von Hintergrundprozessen mit dem kill-Befehl
  6. Ausführen von Prozessen, die auch nach dem Abmelden weiterlaufen, mit nohup und disown

Diese Fähigkeiten sind grundlegend für die effiziente Arbeit in Linux-Umgebungen, insbesondere wenn es um langlaufende Aufgaben geht oder wenn Sie auf Remote-Servern arbeiten. Indem Sie Prozesse im Hintergrund ausführen, können Sie Ihre Produktivität maximieren, indem Sie mehrere Aufgaben gleichzeitig ausführen, ohne Ihre Terminalsitzung zu blockieren.