- 1 Section
- 10 Lessons
- unbegrenzt
- Bash / Shell-Scripting10
- 1.1Was ist eine Shell? bash, sh, zsh im Vergleich
- 1.2Grundlegende Befehle: cd, ls, cp, mv, rm, grep
- 1.3Variablen, Eingabe und Ausgabe
- 1.4Kontrollstrukturen: if, case, for, while
- 1.5Funktionen und Argumente
- 1.6Fehlerbehandlung: exit codes, trap
- 1.7Textverarbeitung: sed, awk, cut, sort
- 1.8Dateisystem-Automation: find, xargs, cron
- 1.9Netzwerk-Scripting: curl, ssh, rsync
- 1.10Praxisprojekt: Systemstatus- und Backup-Script
Dateisystem-Automation: find, xargs, cron
Bisher hast du Befehle direkt aufs Dateisystem losgelassen. Aber in der echten Server-Welt willst du oft regelbasiert arbeiten: „Finde alle Logs älter als 30 Tage und lösche sie." „Komprimiere jede Nacht alle .log-Dateien." „Schicke eine Mail wenn die Festplatte voll wird." Das sind die Aufgaben dieser Lektion.
Drei Werkzeuge bilden das Rückgrat der Server-Automation: find (Dateien nach Kriterien suchen), xargs (Befehle auf viele Argumente anwenden) und cron (Zeit-gesteuerte Aufgaben). Wer diese drei meistert, ist als FISI sofort produktiv – sie kommen in jedem Server-Alltag vor.
1) find – das mächtige Suchwerkzeug
Während ls nur das aktuelle Verzeichnis listet, durchsucht find rekursiv ganze Verzeichnisbäume nach beliebigen Kriterien. Name, Größe, Datum, Typ, Rechte, Inhalt – alles kombinierbar:
-o in Klammern: find . \( -name "*.log" -o -name "*.txt" \). Die Backslashes vor den Klammern sind nötig damit Bash sie nicht selbst interpretiert. Wichtig: immer erst ohne -delete testen! Lass dir die Treffer erst anzeigen, prüfe sie, dann erst mit -delete ergänzen.2) find-Aktionen: nicht nur suchen, auch handeln
find findet nicht nur – es kann auch direkt Aktionen mit den Treffern ausführen. Drei wichtige Aktionen:
ls -l: Rechte, Größe, Datum für jeden Treffer.{} wird durch Dateinamen ersetzt. \; beendet (Pflicht!).find . -mtime +30 -name "*.log" ausführen und prüfen welche Dateien das überhaupt sind. Dann erst ... -delete dranhängen. Das hat schon viele Datenverluste verhindert.3) xargs – wenn find allein nicht reicht
xargs nimmt Eingaben (Zeile für Zeile) und macht aus ihnen Argumente für einen anderen Befehl. Klingt abstrakt, ist aber super praktisch:
Die -print0 / -0-Kombination trennt Dateinamen mit NULL-Bytes statt Zeilenumbrüchen. Das ist sicher gegen Dateinamen mit Leerzeichen, Zeilenumbrüchen oder anderen Sonderzeichen. In Skripten immer diese Variante nehmen – sonst zerbricht es spätestens bei „Mein Dokument.txt".
4) find vs. xargs vs. -exec – wann was?
Es gibt drei Wege wie du einen Befehl auf gefundene Dateien anwendest. Welcher ist der richtige?
| Variante | Beispiel | Wann nutzen |
|---|---|---|
-exec ... \; | find . -name "*.log" -exec gzip {} \; | Startet pro Datei einen Befehl. Sicher bei Sonderzeichen. Langsam bei vielen Dateien. |
-exec ... + | find . -name "*.log" -exec rm {} + | Bündelt mehrere Dateien pro Befehl. Schneller. Empfohlen wenn der Befehl mehrere Args verkraftet. |
| xargs | find . -name "*.log" \| xargs grep "ERROR" | Pipe-basiert, mit Parallelisierung (-P). Bei Sonderzeichen -print0 + -0 verwenden. |
Faustregel: für simple Sachen -exec ... + nehmen – ist Teil von find und braucht keine Pipe. Für Parallel-Verarbeitung oder besondere xargs-Features die Pipe-Variante. -exec ... \; nur wenn der Befehl wirklich nur ein Argument auf einmal verkraftet.
5) Praxis-Beispiele: typische Server-Aufgaben
Was wirst du als FISI immer wieder brauchen?
Speichere dir solche Befehle in einem persönlichen Cheat-Sheet oder als Aliases in ~/.bashrc – du wirst sie immer wieder brauchen. Vorsicht beim Kopieren von Internet-Beispielen: prüfe immer was sie wirklich tun, gerade bei -delete oder -exec rm.
6) cron – wiederkehrende Aufgaben planen
Bisher hast du Befehle manuell gestartet. Aber was wenn du ein Backup um 3 Uhr morgens machen willst? Oder einen Log-Cleanup jeden Sonntag? Dafür gibt es cron: einen Daemon der dauerhaft im Hintergrund läuft und zur richtigen Zeit deine Befehle startet.
Konfiguriert wird cron über eine Crontab – eine Tabelle mit Zeilen wie „immer zu Zeit X führe Befehl Y aus". Jeder User hat seine eigene Crontab. Bearbeiten mit crontab -e, anzeigen mit crontab -l, löschen mit crontab -r.
7) Die Cron-Syntax: fünf Felder + Befehl
Jede Zeile in der Crontab hat dieses Format:
* = jeder Wert, 5 = nur Wert 5, 1,3,5 = mehrere Werte, 1-5 = Bereich, */15 = alle 15 (Schritte). Wochentage: 0 oder 7 = Sonntag, 1 = Montag, ... 6 = Samstag. Drei nützliche Tools: crontab.guru (Browser-Tool zum Visualisieren), crontab -l zum Anzeigen, @reboot als Spezial-Zeit für „beim Bootvorgang".8) Beispiele für Cron-Jobs
Wie sieht eine echte Crontab aus? So:
9) Häufige Cron-Stolperfallen
Cron ist täglich Brot für FISIs – aber es gibt klassische Fehler:
- Cron hat fast keine Umgebung.
$PATHist sehr minimal, eigene Variablen aus.bashrcfehlen. Lösung: in Skripten volle Pfade nutzen (/usr/bin/rsyncstatt nurrsync) und benötigte Variablen am Anfang setzen. - Output geht an Email. Standardmäßig schickt cron jede Output-Zeile per Mail an den User. Bei stündlichen Jobs ist die Inbox schnell voll. Lösung:
>/dev/null 2>&1anhängen oder in Logdatei umlenken. - Skript funktioniert manuell, in cron nicht. Meist Umgebungs-Problem (siehe oben). Zum Debuggen: setze am Skript-Anfang
env > /tmp/cronenv.txtund schau dir das nach dem ersten Lauf an. - Lange Befehle in Crontab werden unleserlich. Besser: erstelle ein Skript im Dateisystem und rufe es aus cron auf.
- Zeitzonen. Cron läuft in der System-Zeitzone. Bei Servern oft UTC eingestellt – 3 Uhr UTC ist nicht 3 Uhr lokal!
- Letzter Lauf abschließen lassen. Wenn dein Job länger dauert als das Intervall, läuft er parallel mit sich selbst. Lock-File-Pattern nutzen oder
flock.
10) systemd-Timer – die moderne Alternative
Moderne Linux-Systeme (alle mit systemd) haben zusätzlich systemd-Timer als Alternative zu cron. Vorteile: bessere Logging-Integration, Abhängigkeiten zwischen Jobs, einfache Statusabfrage, kein „verpasste Läufe" bei ausgeschaltetem Rechner (mit Persistent=true).
Aufbau: eine .timer-Datei (sagt WANN) plus eine .service-Datei (sagt WAS). Mehr Aufwand für simple Jobs, aber für komplexe Setups oft besser. In K29 Linux-Server wird systemd ausführlich behandelt. Für FISI-Alltag reicht aber meist klassisches cron.
11) Lock-Files: parallele Läufe verhindern
Ein Klassiker: dein cron-Job läuft jede Minute, dauert aber gelegentlich 3 Minuten. Schon laufen 3 Instanzen parallel und behindern sich. Lösung: ein Lock-File:
Eleganter geht's mit dem flock-Befehl der das alles übernimmt: flock -n /var/run/mein-job.lock /usr/local/bin/mein-skript.sh. -n heißt „non-blocking": wenn Lock schon belegt → sofort raus statt warten. Diese Zeile direkt in der Crontab ist eine elegante Lösung.
12) Backup-Pattern: find + tar + cron
Bringen wir alles zusammen für einen klassischen Server-Job – tägliches Backup mit Aufbewahrung der letzten 7 Tage:
Crontab-Eintrag (mit crontab -e):
Das ist im Prinzip der Stoff aus dem Praxisprojekt (L10) – nur knapp. Vollständige Backup-Strategien (inkrementell, Off-Site, Verschlüsselung) findest du in K58 Backup-Strategien.
Zusammenfassung
find sucht rekursiv nach Kriterien: -name, -type f/d, -size +/-N, -mtime +/-N, -perm. Aktionen: -print (Default), -ls, -delete, -exec befehl {} \; oder +. Erst immer ohne Aktion testen! xargs macht aus stdin Argumente für einen anderen Befehl. Mit -print0 + -0 sicher gegen Leerzeichen. -P N für parallele Ausführung. cron = Zeit-gesteuerte Jobs. Crontab editieren mit crontab -e. Syntax: m h dom mon dow command – Sterne und Zahlen 0-59/0-23/1-31/1-12/0-7. Shortcuts: @daily, @hourly, @reboot. Stolperfallen: minimale Umgebung (volle Pfade!), Output landet in Mail, Zeitzonen, parallele Läufe (→ Lock-File mit flock). Output umlenken: >> logfile 2>&1.
