Kurz: Jedes laufende Programm ist ein Prozess mit einer Nummer (PID).
Teil des Kurses Bash
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 weiterIm 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: 124Signale 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: 0Zeitgesteuerte 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 StartTipps 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 # PortweiterleitungAnmeldung 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_ed25519Danach genügt ssh produktion.
Pakete und Systemdienste
| Aufgabe | Debian/Ubuntu | Fedora/RHEL | macOS (Homebrew) |
|---|---|---|---|
| Liste aktualisieren | sudo apt update | sudo dnf check-update | brew update |
| Installieren | sudo apt install paket | sudo dnf install paket | brew install paket |
| Suchen | apt search begriff | dnf search begriff | brew search begriff |
| Entfernen | sudo apt remove paket | sudo dnf remove paket | brew 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 -sAusgabe:
Kerne ist Zahl: ja Kernel: Linux
df funktioniert
free vorhanden
whoami funktioniert
id funktioniert
LinuxWeitere 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 auswertenAchtung
curl ... | bashführt fremden Code aus. Prüfe das Skript vorher.
Merke
- Prozesse:
ps,top,kill,pkill,$!,wait,timeout trapfängt Signale abcron: fünf Zeitfelder, absolute Pfade, Ausgabe loggen- SSH mit Schlüsseln,
scp/rsyncfür Dateien - Paketmanager (
apt,dnf,brew) undsystemctlfü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
Welcher Cron-Ausdruck läuft täglich um 02:30?
- **30 2 * * *** (richtig)
- 2 30 * * *
- 2 30 *
- 30 2 2 * *
Was beendet kill -9 ?
- Erzwingt das Beenden eines Prozesses (SIGKILL) (richtig)
- Pausiert ihn
- Startet ihn neu
- Ändert seine Priorität
Wie meldet man sich sicher ohne Passwort per SSH an?
- Mit einem Schlüsselpaar (ssh-keygen, ssh-copy-id) (richtig)
- Mit Telnet
- Mit FTP
- Gar nicht
Weiter im Kurs
Zurück: Robuste Skripte und Fehlerbehandlung
Weiter: Projekte: Skripte aus der Praxis
Alle Kapitel: Bash im Überblick