EMZETT.
Login

Kurz: Jedes laufende Programm ist ein Prozess mit einer Nummer (PID).

Teil des Kurses Bash

Kapitel 11 von 13 im Kurs Bash (Abschnitt „Administration“). Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

Prozesse

Jedes laufende Programm ist ein Prozess mit einer Nummer (PID).

ps aux                  # alle Prozesse
ps aux | grep nginx     # bestimmte suchen
pgrep -a python         # PIDs nach Namen
top / htop              # Live-Ansicht (q beendet)
kill 1234               # sanft beenden (SIGTERM)
kill -9 1234            # erzwingen (SIGKILL), nur wenn nötig
pkill -f meinskript     # nach Namen beenden
nohup ./lang.sh &       # läuft nach dem Logout weiter

Im Skript:

sleep 30 &
pid=$!
echo "gestartet: läuft=$(kill -0 "$pid" 2>/dev/null && echo ja || echo nein)"
kill "$pid"
wait "$pid" 2>/dev/null
echo "beendet mit Status $?  (143 = durch SIGTERM beendet)"
echo "Eigene PID ist numerisch: $([[ $$ =~ ^[0-9]+$ ]] && echo ja)"
timeout 0.2 sleep 5; echo "timeout-Status: $?"

Ausgabe:

gestartet: läuft=ja
beendet mit Status 143  (143 = durch SIGTERM beendet)
Eigene PID ist numerisch: ja
timeout-Status: 124

Signale abfangen

bash -c '
trap "echo Signal empfangen, räume auf; exit 0" TERM
echo bereit
kill -TERM $$
sleep 1
echo "nicht erreicht"
'; echo "Status: $?"

Ausgabe:

bereit
Signal empfangen, räume auf
Status: 0

Zeitgesteuerte Aufgaben mit cron

cron startet Befehle zu festen Zeiten. Bearbeiten mit crontab -e, anzeigen mit crontab -l. Eine Zeile hat fünf Zeitfelder und den Befehl:

# ┌ Minute (0-59)
# │ ┌ Stunde (0-23)
# │ │ ┌ Tag des Monats (1-31)
# │ │ │ ┌ Monat (1-12)
# │ │ │ │ ┌ Wochentag (0-7, 0 und 7 = Sonntag)
# │ │ │ │ │
  30 2 * * *     /home/mia/backup.sh           # täglich 02:30
  */15 * * * *   /home/mia/pruefe.sh           # alle 15 Minuten
  0 9 * * 1-5    /home/mia/bericht.sh          # werktags 9 Uhr
  0 0 1 * *      /home/mia/monatsabschluss.sh  # am Monatsersten um Mitternacht
  @reboot        /home/mia/start.sh            # beim Start

Tipps für cron-Skripte: absolute Pfade verwenden (cron hat kaum Umgebungsvariablen), Ausgabe in eine Logdatei leiten (>> /var/log/job.log 2>&1), Skript vorher manuell testen. Moderne Alternative: systemd-Timer. Mit dem Cron-Rechner im Werkzeugbereich dieser Seite prüfst du Ausdrücke.

Remote arbeiten mit SSH

ssh mia@server.example.com             # anmelden
ssh -p 2222 mia@server                 # anderer Port
ssh mia@server 'df -h | head -3'       # einen Befehl ausführen
ssh-keygen -t ed25519                  # Schlüsselpaar erzeugen
ssh-copy-id mia@server                 # öffentlichen Schlüssel hinterlegen
scp datei.txt mia@server:/tmp/         # Datei kopieren
rsync -avz ordner/ mia@server:/backup/ # synchronisieren (nur Änderungen)
ssh -L 8080:localhost:80 mia@server    # Portweiterleitung

Anmeldung per Schlüssel statt Passwort ist sicherer. Die Konfiguration in ~/.ssh/config spart Tipparbeit:

Host produktion
    HostName server.example.com
    User mia
    IdentityFile ~/.ssh/id_ed25519

Danach genügt ssh produktion.

Pakete und Systemdienste

AufgabeDebian/UbuntuFedora/RHELmacOS (Homebrew)
Liste aktualisierensudo apt updatesudo dnf check-updatebrew update
Installierensudo apt install paketsudo dnf install paketbrew install paket
Suchenapt search begriffdnf search begriffbrew search begriff
Entfernensudo apt remove paketsudo dnf remove paketbrew uninstall paket

Dienste verwaltet systemd:

systemctl status nginx
sudo systemctl start|stop|restart|enable nginx
journalctl -u nginx -f              # Logs live
journalctl --since "1 hour ago"

System im Blick

echo "Kerne ist Zahl: $([[ $(nproc) =~ ^[0-9]+$ ]] && echo ja)  Kernel: $(uname -s)"
df -h / >/dev/null && echo "df funktioniert"
free >/dev/null 2>&1 && echo "free vorhanden"
whoami >/dev/null && echo "whoami funktioniert"
id -u >/dev/null && echo "id funktioniert"
uname -s

Ausgabe:

Kerne ist Zahl: ja  Kernel: Linux
df funktioniert
free vorhanden
whoami funktioniert
id funktioniert
Linux

Weitere nützliche Befehle: uptime, free -h, lsblk, ip addr, ss -tulpn (offene Ports), curl, dig, ping.

Netzwerk und Webanfragen

curl -s https://example.com | head                 # Seite abrufen
curl -sI https://example.com | head -3             # nur Header
curl -X POST -H 'Content-Type: application/json' -d '{"a":1}' https://api.example.com/x
curl -fsSL https://example.com/install.sh | less   # erst ansehen, dann ausführen!
wget https://example.com/datei.zip
jq '.name' daten.json                              # JSON auswerten

Achtung

curl ... | bash führt fremden Code aus. Prüfe das Skript vorher.

Merke

  • Prozesse: ps, top, kill, pkill, $!, wait, timeout
  • trap fängt Signale ab
  • cron: fünf Zeitfelder, absolute Pfade, Ausgabe loggen
  • SSH mit Schlüsseln, scp/rsync für Dateien
  • Paketmanager (apt, dnf, brew) und systemctl für Dienste

Übungsaufgabe

Schreibe ein Backup-Skript und trage es per crontab täglich um 3 Uhr ein (nur als Text planen).

Quiz zur Selbstkontrolle

Weiter im Kurs

Zurück: Robuste Skripte und Fehlerbehandlung

Weiter: Projekte: Skripte aus der Praxis

Alle Kapitel: Bash im Überblick