linux-cli-shell shell processes background-jobs pipes productivity advanced

Process Management: Jobs & Pipes (Artikel 250)

Beherrschung der Prozesssteuerung unter Linux. Erfahren Sie alles über Hintergrundprozesse, Job-Control, Named Pipes und die effiziente Verkettung von Befehlen.

# Process Control Masterclass: Jobs, Pipes und Signale

TL;DR / Management Summary Wer nur einen Befehl nach dem anderen tippt, nutzt nur einen Bruchteil der Linux-Power. Ein Senior Admin nutzt Job Control, um langwierige Prozesse in den Hintergrund zu schieben (&), befreit sie vom Terminal-Zwang (disown) und verkettet dutzende Werkzeuge mittels Pipes (|), um komplexe Datenströme in Echtzeit zu transformieren. In diesem Modul lernen wir, wie man Herr über hunderte Prozesse bleibt, ohne den Überblick zu verlieren.


# 1. Einführung & Architektur

Der Datenfluss.

In Linux ist jeder Befehl ein Prozess. Pipes verbinden die Standard-Ausgabe (stdout) eines Prozesses mit der Standard-Eingabe (stdin) des nächsten.

# Die Pipeline-Architektur (Mermaid)

graph LR
    A[cat access.log] -->|stdout to stdin| B[grep '404']
    B -->|stdout to stdin| C[awk '{print $1}']
    C -->|stdout to stdin| D[sort | uniq -c]
    D -->|stdout| E[Final Result: Terminal]
    subgraph "Execution Layer"
        F[Background Job &]
        G[Stopped Job CTRL+Z]
    end

# 2. Job Control: Multitasking im Terminal

Prozesse jonglieren.

# In den Hintergrund schieben

# Befehl direkt im Hintergrund starten
./long_backup.sh &

# Laufenden Befehl pausieren und wegschieben
# 1. CTRL + Z drücken (Pausiert Prozess)
# 2. 'bg' eingeben (Lässt ihn im Hintergrund weiterlaufen)

# Zurückholen und Verwalten

# Liste aller Jobs dieser Shell
jobs

# Job Nr. 1 wieder in den Vordergrund holen
fg %1

# 3. Disown und nohup: Überleben ohne Terminal

Prozesse persistent machen.

Normalerweise stirbt ein Hintergrundprozess, wenn Sie die SSH-Sitzung schließen (SIGHUP).

# nohup (Vorher entscheiden)

nohup ./script.sh &
# Output landet automatisch in 'nohup.out'

# disown (Hinterher entscheiden)

Wenn der Prozess bereits läuft und Sie nach Hause wollen:

./script.sh &
disown %1
# Jetzt können Sie das Terminal schließen, der Prozess läuft weiter.

# 4. Day-2 Operations: Fortgeschrittene Pipes

Mehr als nur grep.

# Tee: Abzweigungen im Datenstrom

tee schreibt die Ausgabe in eine Datei und reicht sie an den nächsten Befehl weiter.

cat logs | tee backup.log | grep "ERROR"

# Named Pipes (FIFO)

Erstellen Sie eine Datei, die als permanenter Puffer zwischen zwei Programmen dient.

mkfifo /tmp/my_pipe
# Prozess A schreibt: echo "Hallo" > /tmp/my_pipe
# Prozess B liest: cat /tmp/my_pipe

# 5. Troubleshooting & “War Stories”

Wenn der Prozess nicht stirbt.

# Story 1: “Der hängende disown-Job”

Symptom: Ein Admin hat einen Job mit & gestartet und disown gemacht. Der Prozess braucht nun 100% CPU, aber er taucht nicht mehr in jobs auf. Ursache: disown entfernt den Job aus der internen Tabelle der aktuellen Shell. Lösung: Nutzen Sie ps aux | grep <name> oder pgrep <name>, um die System-PID zu finden, und killen Sie ihn mit kill -9 <PID>.

# Story 2: “Broken Pipe Errors”

Symptom: Ein Skript bricht mit EPIPE oder Broken Pipe ab. Ursache: Der empfangende Teil einer Pipe (z.B. head -n 1) hat sich bereits beendet, während der sendende Teil noch Daten schickt. Lösung: Dies ist oft normales Verhalten. Falls es Fehler in Logs verursacht, nutzen Sie trap '' PIPE am Anfang Ihres Skripts, um das Signal zu ignorieren.


# 6. Fazit & Empfehlung

  • Wahl: Nutzen Sie tmux oder screen für wirklich wichtige, langlaufende Tasks. Job-Control ist gut für kurze Hintergrund-Aktionen.
  • Performance: Lange Pipes (A | B | C | D) sind extrem effizient, da der Kernel das Buffering zwischen den Prozessen im RAM übernimmt.
  • Wichtig: Prüfen Sie regelmäßig mit top oder htop, ob Ihre Hintergrund-Jobs das System überlasten.

# Anhang: Cheatsheet

Befehl Wirkung
& Startet im Hintergrund.
CTRL + Z Pausiert Vordergrund-Prozess.
bg Setzt pausierten Prozess im Hintergrund fort.
fg Holt Prozess in den Vordergrund.
jobs Listet Jobs der aktuellen Shell.
disown -a Koppelt alle Jobs vom Terminal ab.
kill %1 Beendet Job Nr. 1.
wait Wartet im Skript, bis alle Hintergrund-Jobs fertig sind.
` &`