Einführung
Willkommen, angehender Systemadministrator! Du hast gerade als Junior-DevOps-Ingenieur bei einem stark ausgelasteten Technologieunternehmen angefangen. Dein erfahrener Kollege befindet sich in einem wohlverdienten Urlaub, und eine wichtige Aufgabe ist soeben auf deinem Schreibtisch gelandet. Der zentrale Anwendungsserver erzeugt zahlreiche Protokolldateien, die den verfügbaren Speicherplatz rasch aufbrauchen. Deine Mission – sofern du sie annimmst – besteht darin, zum Skript-Künstler zu werden.
Du sollst ein automatisiertes Shell-Skript zur Verwaltung dieser Protokolldateien erstellen. Dabei geht es nicht nur darum, ein paar Befehle auszuführen, sondern ein robustes und wiederverwendbares Werkzeug zu entwickeln. Du beginnst mit einem einfachen Skript und ergänzt schrittweise Funktionen wie Variablen, Benutzereingaben, Fehlerprüfungen und Schleifen. Am Ende dieser Herausforderung hast du ein Skript entwickelt, das Dateien sichern und verwalten kann – und damit deinen Wert für das Team unter Beweis gestellt und den Tag gerettet!
Auf geht’s mit dem Skripten!
- Überspringe die Herausforderung vorübergehend und fahre mit den nachfolgenden Guided Labs im Linux-Lernpfad fort.
- Besprich das Problem mit Labby oder sieh dir die Lösung an.
Ein einfaches Shell-Skript schreiben
Deine erste Aufgabe besteht darin, die Grundlage zu schaffen. Jedes gute Skript beginnt mit einer einzigen Zeile. Du musst die Skriptdatei erstellen und einen grundlegenden Befehl hinzufügen, um sicherzustellen, dass alles korrekt funktioniert. Dieser erste Schritt bestätigt, dass deine Umgebung richtig eingerichtet ist und du bereit bist, komplexere Logik zu entwickeln.
Aufgaben
- Erstelle im Verzeichnis
~/projecteine neue Shell-Skriptdatei mit dem Namenlog_manager.sh. - Füge ganz oben im Skript eine „Shebang“-Zeile (
#!/bin/bash) ein. Sie teilt dem System mit, welcher Interpreter verwendet werden soll. - Füge einen Befehl hinzu, der die Meldung „Log Manager Initialized.“ auf dem Bildschirm ausgibt.
- Mache das Skript mit dem Befehl
chmod +xausführbar.
Anforderungen
- Das Skript muss
log_manager.shheißen. - Das Skript muss sich im Verzeichnis
~/projectbefinden. - Die erste Zeile muss
#!/bin/bashlauten. - Das Skript muss den Befehl
echoverwenden, um die geforderte Meldung auszugeben. - Das Skript muss über Ausführungsrechte verfügen (verwende
chmod +x log_manager.sh).
Beispiele
Nach dem Erstellen und Ausführbarmachen des Skripts sollte der vollständige Ablauf so aussehen:
Überprüfe zunächst, ob die Skriptdatei vorhanden ist:
ls ~/project/
log_manager.sh
Setze die Ausführungsrechte für das Skript:
chmod +x ~/project/log_manager.sh
Führe das Skript nun aus:
./log_manager.sh
Das Skript sollte Folgendes ausgeben:
Log Manager Initialized.
Du kannst außerdem überprüfen, ob der Inhalt des Skripts korrekt ist:
cat ~/project/log_manager.sh
Die Datei sollte Folgendes enthalten:
#!/bin/bash
echo "Log Manager Initialized."
Hinweise
- Du kannst einen textbasierten Editor wie
nanoverwenden, um die Datei zu erstellen und zu bearbeiten. Zum Beispiel:nano log_manager.sh. - Der Befehl
echowird verwendet, um eine Textzeile auszugeben. - Verwende
chmod +x filename, um ein Skript ausführbar zu machen. Mit+xwerden dem Dateibesitzer Ausführungsrechte erteilt.
Variablen und Benutzereingaben hinzufügen
Ein Skript mit fest codierten Werten ist wenig flexibel. Damit dein Skript dynamischer und wiederverwendbar wird, führst du nun Variablen ein. Du definierst eine Variable für das Protokollverzeichnis und bittest den Benutzer um eine Bezeichnung für den Sicherungslauf. Dadurch lässt sich das Skript an unterschiedliche Situationen anpassen, ohne den Code selbst ändern zu müssen.
Aufgaben
- Ändere dein Skript
log_manager.sh. - Definiere eine Variable namens
LOG_DIRund weise ihr den Pfad/home/labex/project/app_logszu. - Füge eine Zeile hinzu, die „Enter the backup filename: “ ausgibt, um den Benutzer zur Eingabe aufzufordern.
- Verwende den Befehl
read, um die Eingabe des Benutzers in einer neuen Variable namensBACKUP_FILENAMEzu speichern. - Füge einen abschließenden
echo-Befehl hinzu, der die Einstellungen bestätigt und eine Meldung wie „Backing up logs to: [filename]“ ausgibt, wobei[filename]durch den vom Benutzer eingegebenen Wert ersetzt wird.
Anforderungen
- Das Skript muss eine Variable
LOG_DIRenthalten, die auf/home/labex/project/app_logsgesetzt ist. - Das Skript muss den Befehl
readverwenden, um eine Benutzereingabe einzulesen. - Die Eingabe des Benutzers muss in einer Variable namens
BACKUP_FILENAMEgespeichert werden. - Die abschließende Ausgabe muss die Variable
$BACKUP_FILENAMEverwenden.
Beispiele
Wenn du das geänderte Skript ausführst, sollte es zur Eingabe auffordern und anschließend eine Bestätigungsmeldung anzeigen. Die Interaktion sollte folgendermaßen aussehen:
./log_manager.sh
Log Manager Initialized.
Enter the backup filename: daily_backup
Backing up logs to: daily_backup
Das Skript sollte bei der Eingabeaufforderung „Enter the backup filename:“ anhalten und darauf warten, dass der Benutzer einen Namen eingibt und Enter drückt. Nach der Eingabe wird die Bestätigungsmeldung mit dem eingegebenen Wert ausgegeben. In dieser Herausforderung dient dieser Wert als Bezeichnung des Laufs und wird in der Ausgabe angezeigt. Die eigentliche Sicherungsaktion wird in Schritt 4 umgesetzt, indem .log-Dateien nach ~/project/backups kopiert werden.
Hinweise
- Um eine Variable zu definieren, verwende die Syntax
VARIABLE_NAME="value". Vor und nach dem Zeichen=dürfen keine Leerzeichen stehen. - Um den Wert einer Variablen zu verwenden, stelle ihrem Namen ein
$-Zeichen voran, zum Beispiel$MY_VARIABLE. - Der Befehl
readhält das Skript an und wartet darauf, dass der Benutzer etwas eingibt undEnterdrückt.
Bedingte Logik implementieren
Ein gutes Skript ist auf mögliche Probleme vorbereitet. Was passiert, wenn das angegebene Protokollverzeichnis nicht existiert? Das Skript würde fehlschlagen. Damit dein Skript robuster wird, musst du eine bedingte Prüfung ergänzen. Mit einer if-Anweisung überprüfst du, ob das Protokollverzeichnis vorhanden ist, bevor irgendwelche Aktionen ausgeführt werden.
Aufgaben
- Ändere dein Skript
log_manager.sh. - Füge eine
if-Anweisung hinzu, die überprüft, ob das durch die Variable$LOG_DIRangegebene Verzeichnis existiert. - Wenn das Verzeichnis existiert, soll das Skript wie bisher fortfahren (Dateinamen abfragen usw.).
- Wenn das Verzeichnis nicht existiert, soll das Skript die Fehlermeldung „Error: Log directory not found.“ ausgeben und sofort mit einem Statuscode ungleich null beendet werden.
Anforderungen
- Das Skript muss eine
if-Anweisung verwenden. - Die Bedingung muss mit dem Testoperator
-dprüfen, ob ein Verzeichnis existiert. - Wenn das Verzeichnis nicht existiert, muss das Skript die angegebene Fehlermeldung mit
echoausgeben. - Wenn das Verzeichnis nicht existiert, muss das Skript mit
exit 1beendet werden.
Beispiele
Wenn das Protokollverzeichnis existiert, sollte das Skript normal ausgeführt werden:
./log_manager.sh
Log Manager Initialized.
Log directory found. Proceeding...
Enter the backup filename: test_backup.tar.gz
Backing up logs to: test_backup.tar.gz
Wenn das Protokollverzeichnis nicht existiert, sollte das Skript einen Fehler ausgeben und beendet werden:
./log_manager.sh
Log Manager Initialized.
Error: Log directory not found.
In diesem Fall wird das Skript unmittelbar nach der Fehlermeldung beendet, ohne eine Benutzereingabe abzufragen oder Sicherungsaktionen auszuführen.
Hinweise
- Die Syntax für eine einfache
if-Anweisung lautet:if [ condition ]; then ... else ... fi. - Der Test
[ -d "$DIRECTORY_PATH" ]liefert „wahr“, wenn$DIRECTORY_PATHexistiert und ein Verzeichnis ist. exit 1ist eine übliche Methode, um anzuzeigen, dass ein Skript aufgrund eines Fehlers beendet wurde.
Dateivorgänge mit einer Schleife ausführen
Nun folgt der Kern der Automatisierung! Du musst die Dateien im Protokollverzeichnis verarbeiten. Mit einer for-Schleife durchläufst du alle Dateien mit der Endung .log im Verzeichnis app_logs. In dieser Herausforderung kopierst du sie einfach in ein neues Sicherungsverzeichnis. Die Eingabe BACKUP_FILENAME bleibt eine Bezeichnung des Laufs, die in der Ausgabe angezeigt wird; sie wird nicht als Archivdatei vom Skript erstellt.
Aufgaben
- Erstelle zunächst innerhalb von
~/projectein Verzeichnis namensbackups, in das die Protokolldateien kopiert werden. - Ändere dein Skript
log_manager.sh. - Füge innerhalb des
if-Blocks, in dem die Existenz des Verzeichnisses bestätigt wird, einefor-Schleife hinzu. - Die Schleife soll jede Datei mit der Endung
.logim Verzeichnis$LOG_DIRdurchlaufen. - Verwende innerhalb der Schleife den Befehl
cp, um jede Protokolldatei in das Verzeichnis~/project/backupszu kopieren. - Gib für jede kopierte Datei eine Meldung wie „Copied [filename]“ aus.
Anforderungen
- Du musst das Verzeichnis
~/project/backupszunächst über die Befehlszeile erstellen. - Das Skript muss eine
for-Schleife verwenden. - Die Schleife muss die Dateien in
$LOG_DIRdurchlaufen, die dem Muster*.logentsprechen. - Innerhalb der Schleife muss der Befehl
cpverwendet werden, um die Dateien nach~/project/backupszu kopieren. - Eine
echo-Anweisung muss beim Kopieren den Namen jeder Datei ausgeben.
Beispiele
Nach Abschluss dieses Schritts sollte das Skript beim Ausführen mit einem Sicherungsnamen alle Protokolldateien verarbeiten und eine ähnliche Ausgabe anzeigen:
./log_manager.sh
Log Manager Initialized.
Log directory found. Proceeding...
Enter the backup filename: daily_backup
Backing up logs to: daily_backup
Copied /home/labex/project/app_logs/access.log
Copied /home/labex/project/app_logs/debug.log
Copied /home/labex/project/app_logs/error.log
Backup complete.
Das Skript sollte jede .log-Datei im Verzeichnis durchlaufen und für jede Datei eine Meldung mit „Copied“ ausgeben. Die genauen Dateinamen hängen von den Protokolldateien ab, die sich in deinem Verzeichnis app_logs befinden.
Nach Abschluss des Skripts kannst du überprüfen, ob die Dateien kopiert wurden, indem du das Verzeichnis backups auflistest:
ls ~/project/backups/
access.log debug.log error.log
Hinweise
- Mit dem Befehl
mkdirkannst du ein Verzeichnis erstellen. - Eine
for-Schleife für Dateien kann beispielsweise so geschrieben werden:for file in /path/to/*.log; do ... done. - Die Syntax des Befehls
cplautet:cp <source> <destination>. - Die Schleifenvariable (zum Beispiel
file) enthält in jeder Iteration den vollständigen Pfad zur jeweiligen Datei.
Zusammenfassung
Herzlichen Glückwunsch, Skript-Künstler! Du hast erfolgreich ein vollständiges und funktionsfähiges Shell-Skript von Grund auf entwickelt. Du hast ein Problem aus der Praxis – die Verwaltung von Protokolldateien – mit der Kraft der Automatisierung gelöst.
In dieser Herausforderung hast du mehrere grundlegende Konzepte des Shell-Skriptens gemeistert:
- Ein Skript mit einer Shebang-Zeile erstellen und strukturieren.
- Variablen verwenden, um dein Skript dynamisch zu gestalten.
- Benutzereingaben mit
readeinlesen. - Mit
if-Anweisungen eine robuste Fehlerprüfung implementieren. - Wiederkehrende Aufgaben mit
for-Schleifen automatisieren. - Dateiberechtigungen verwalten und dein Skript ausführen.
Dein Skript kann nun automatisch prüfen, ob Protokollverzeichnisse vorhanden sind, alle Protokolldateien verarbeiten und sie an einen Sicherungsort kopieren. Das ist ein großer Schritt auf deinem Weg zum DevOps-Ingenieur oder Systemadministrator. Die hier geübten Fähigkeiten bilden die Grundlage für deutlich komplexere Automatisierungsskripte, mit denen sich Server verwalten, Anwendungen bereitstellen und Daten verarbeiten lassen. Du hast bewiesen, dass du Verantwortung übernehmen und eine funktionierende Lösung liefern kannst. Hervorragend gemacht!



