Der Skriptkünstler

ShellBeginner
Jetzt üben

Einführung

Willkommen, angehender Systemadministrator! Sie sind gerade als Junior DevOps Engineer in ein viel beschäftigtes Technologieunternehmen eingestiegen. Ihre erfahrene Kollegin oder Ihr erfahrener Kollege befindet sich im wohlverdienten Urlaub, und eine kritische Aufgabe liegt bereits auf Ihrem Schreibtisch. Der Hauptanwendungsserver erzeugt zahlreiche Logdateien, die den Speicherplatz schnell aufbrauchen. Ihre Mission – sofern Sie sie annehmen – besteht darin, zum Skriptkünstler zu werden.

Sie müssen ein automatisiertes Shell-Skript erstellen, das diese Logdateien verwaltet. Es geht nicht nur darum, einige Befehle auszuführen, sondern ein robustes und wiederverwendbares Werkzeug zu entwickeln. Sie beginnen mit einem einfachen Skript und erweitern es schrittweise um Variablen, Benutzereingaben, Fehlerprüfungen und Schleifen. Am Ende dieser Challenge haben Sie ein Skript erstellt, das Dateien sichern und verwalten kann. Damit beweisen Sie Ihren Wert für das Team und retten den Tag!

Beginnen wir mit dem Scripting!

Wichtiger Hinweis
Diese Challenge behandelt Kenntnisse, die über Quick Start with Linux hinausgehen. Wenn Sie diese Themen noch nicht gelernt haben, überspringen Sie die Challenge zunächst und fahren Sie mit Linux for Noobs fort, dem nächsten Kurs im Linux-Lernpfad.
Wann Sie zurückkehren sollten:
  1. Schließen Sie zunächst das Guided Lab Shell Scripting Fundamentals ab. Kehren Sie danach zurück und versuchen Sie diese Challenge erneut.

Ein einfaches Shell-Skript schreiben

Ihre erste Aufgabe besteht darin, die Grundlage zu schaffen. Jedes gute Skript beginnt mit einer einzigen Zeile. Erstellen Sie zunächst die Skriptdatei und fügen Sie einen einfachen Befehl hinzu, um sicherzustellen, dass das Skript korrekt funktioniert. Mit diesem ersten Schritt prüfen Sie, ob Ihre Umgebung richtig eingerichtet ist und Sie bereit sind, komplexere Logik hinzuzufügen.

Aufgaben

  • Erstellen Sie im Verzeichnis ~/project eine neue Shell-Skriptdatei mit dem Namen log_manager.sh.
  • Fügen Sie ganz oben im Skript die sogenannte „Shebang“-Zeile (#!/bin/bash) ein. Sie legt fest, welcher Interpreter verwendet wird.
  • Fügen Sie einen Befehl hinzu, der die Meldung „Log Manager Initialized.“ auf dem Bildschirm ausgibt.
  • Machen Sie das Skript mit dem Befehl chmod +x ausführbar.

Anforderungen

  • Das Skript muss log_manager.sh heißen.
  • Das Skript muss sich im Verzeichnis ~/project befinden.
  • Die erste Zeile muss #!/bin/bash lauten.
  • Das Skript muss den Befehl echo verwenden, um die erforderliche Meldung auszugeben.
  • Das Skript muss Ausführungsrechte besitzen (verwenden Sie chmod +x log_manager.sh).

Beispiele

Nach dem Erstellen und Ausführbarmachen des Skripts sollte der vollständige Ablauf so aussehen:

Prüfen Sie zunächst, ob die Skriptdatei vorhanden ist:

ls ~/project/
log_manager.sh

Setzen Sie die Ausführungsrechte für das Skript:

chmod +x ~/project/log_manager.sh

Führen Sie das Skript nun aus:

./log_manager.sh

Das Skript sollte Folgendes ausgeben:

Log Manager Initialized.

Sie können außerdem prü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

  • Sie können einen Texteditor für die Kommandozeile wie nano verwenden, um die Datei zu erstellen und zu bearbeiten. Beispiel: nano log_manager.sh.
  • Mit dem Befehl echo geben Sie eine Textzeile aus.
  • Verwenden Sie chmod +x filename, um ein Skript ausführbar zu machen. +x fügt der Datei Ausführungsrechte für den Eigentümer hinzu.

Variablen und Benutzereingaben hinzufügen

Ein Skript mit fest einprogrammierten Werten ist wenig flexibel. Damit Ihr Skript dynamischer und wiederverwendbar wird, führen Sie nun Variablen ein. Sie definieren eine Variable für das Logverzeichnis und fordern die Benutzerin oder den Benutzer zur Eingabe einer Bezeichnung für den Sicherungslauf auf. Dadurch lässt sich das Skript an verschiedene Situationen anpassen, ohne den Code zu ändern.

Aufgaben

  • Ändern Sie Ihr Skript log_manager.sh.
  • Definieren Sie eine Variable mit dem Namen LOG_DIR und weisen Sie ihr den Pfad /home/labex/project/app_logs zu.
  • Fügen Sie eine Zeile hinzu, die „Enter the backup filename: “ ausgibt, um eine Eingabeaufforderung anzuzeigen.
  • Verwenden Sie den Befehl read, um die Eingabe der Benutzerin oder des Benutzers in einer neuen Variable namens BACKUP_FILENAME zu speichern.
  • Fügen Sie einen abschließenden echo-Befehl hinzu, der die Einstellungen bestätigt. Geben Sie eine Meldung wie „Backing up logs to: [filename]“ aus, wobei [filename] durch den eingegebenen Wert ersetzt wird.

Anforderungen

  • Das Skript muss eine Variable LOG_DIR enthalten, die auf /home/labex/project/app_logs gesetzt ist.
  • Das Skript muss den Befehl read verwenden, um Eingaben von der Benutzerin oder vom Benutzer zu lesen.
  • Die Eingabe muss in einer Variable namens BACKUP_FILENAME gespeichert werden.
  • Die abschließende Ausgabe muss die Variable $BACKUP_FILENAME verwenden.

Beispiele

Wenn Sie das geänderte Skript ausführen, sollte es zur Eingabe auffordern und anschließend eine Bestätigungsmeldung ausgeben. 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 Sie einen Namen eingeben und Enter drücken. Danach gibt es die Bestätigungsmeldung mit dem eingegebenen Wert aus. In dieser Challenge dient dieser Wert als Bezeichnung für den Lauf und wird in der Ausgabe angezeigt. Die eigentliche Sicherungsaktion wird in Schritt 4 implementiert, indem .log-Dateien nach ~/project/backups kopiert werden.

Hinweise

  • Zum Definieren einer Variable verwenden Sie die Syntax VARIABLE_NAME="value". Um das Zeichen = dürfen keine Leerzeichen stehen.
  • Um den Wert einer Variable zu verwenden, stellen Sie ihrem Namen ein $-Zeichen voran, zum Beispiel $MY_VARIABLE.
  • Der Befehl read hält das Skript an und wartet darauf, dass Sie etwas eingeben und Enter drücken.

Bedingte Logik implementieren

Ein gutes Skript rechnet mit Problemen. Was passiert, wenn das angegebene Logverzeichnis nicht existiert? Das Skript würde fehlschlagen. Damit Ihr Skript robuster wird, müssen Sie eine bedingte Logik hinzufügen. Verwenden Sie eine if-Anweisung, um vor allen weiteren Aktionen zu prüfen, ob das Logverzeichnis vorhanden ist.

Aufgaben

  • Ändern Sie Ihr Skript log_manager.sh.
  • Fügen Sie eine if-Anweisung hinzu, die prüft, ob das von der Variable $LOG_DIR angegebene Verzeichnis existiert.
  • Wenn das Verzeichnis existiert, soll das Skript wie bisher fortfahren, also zur Eingabe des Dateinamens auffordern 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 -d prüfen, ob ein Verzeichnis existiert.
  • Wenn das Verzeichnis nicht existiert, muss das Skript die angegebene Fehlermeldung mit echo ausgeben.
  • Wenn das Verzeichnis nicht existiert, muss das Skript mit exit 1 beendet werden.

Beispiele

Wenn das Logverzeichnis 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 Logverzeichnis 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 direkt nach der Fehlermeldung beendet. Es fordert keine Eingabe an und führt keine Sicherungsaktionen aus.

Hinweise

  • Die Syntax einer einfachen if-Anweisung lautet if [ condition ]; then ... else ... fi.
  • Der Test [ -d "$DIRECTORY_PATH" ] liefert „wahr“, wenn $DIRECTORY_PATH existiert und ein Verzeichnis ist.
  • exit 1 ist eine übliche Methode, um zu signalisieren, dass ein Skript mit einem Fehler beendet wurde.

Dateioperationen mit einer Schleife ausführen

Nun folgt der Kern der Automatisierung! Sie müssen die Dateien im Logverzeichnis verarbeiten. Verwenden Sie eine for-Schleife, um alle Dateien mit der Endung .log im Verzeichnis app_logs zu durchlaufen. In dieser Challenge kopieren Sie die Dateien einfach in ein neues Sicherungsverzeichnis. Die Eingabe BACKUP_FILENAME bleibt eine in der Ausgabe angezeigte Bezeichnung für den Lauf und wird nicht als Archivdatei vom Skript erstellt.

Aufgaben

  • Erstellen Sie zunächst im Verzeichnis ~/project ein Verzeichnis namens backups, in das die Logdateien kopiert werden.
  • Ändern Sie Ihr Skript log_manager.sh.
  • Fügen Sie innerhalb des if-Blocks, in dem die Existenz des Verzeichnisses bestätigt wird, eine for-Schleife hinzu.
  • Die Schleife soll jede Datei mit der Endung .log im Verzeichnis $LOG_DIR durchlaufen.
  • Verwenden Sie innerhalb der Schleife den Befehl cp, um jede Logdatei in das Verzeichnis ~/project/backups zu kopieren.
  • Geben Sie für jede kopierte Datei eine Meldung wie „Copied [filename]“ aus.

Anforderungen

  • Sie müssen das Verzeichnis ~/project/backups zuerst über die Kommandozeile erstellen.
  • Das Skript muss eine for-Schleife verwenden.
  • Die Schleife muss Dateien in $LOG_DIR durchlaufen, die dem Muster *.log entsprechen.
  • Der Befehl cp muss innerhalb der Schleife verwendet werden, um Dateien nach ~/project/backups zu kopieren.
  • Eine echo-Anweisung muss beim Kopieren den Namen jeder Datei ausgeben.

Beispiele

Nach Abschluss dieses Schritts sollte das Skript bei der Ausführung mit einem Sicherungsdateinamen alle Logdateien 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 Logdateien ab, die in Ihrem Verzeichnis app_logs vorhanden sind.

Nach Abschluss des Skripts können Sie prüfen, ob die Dateien kopiert wurden, indem Sie den Inhalt des Verzeichnisses backups anzeigen:

ls ~/project/backups/
access.log  debug.log  error.log

Hinweise

  • Mit dem Befehl mkdir können Sie ein Verzeichnis erstellen.
  • Eine for-Schleife für Dateien kann als for file in /path/to/*.log; do ... done geschrieben werden.
  • Die Syntax des Befehls cp lautet cp <source> <destination>.
  • Die Schleifenvariable, zum Beispiel file, enthält bei jeder Iteration den vollständigen Pfad zur jeweiligen Datei.

Zusammenfassung

Herzlichen Glückwunsch, Skriptkünstler! Sie haben ein vollständiges, funktionsfähiges Shell-Skript von Grund auf erstellt. Sie haben ein Problem aus der Praxis – die Verwaltung von Logdateien – mit den Möglichkeiten der Automatisierung gelöst.

In dieser Challenge haben Sie mehrere grundlegende Konzepte des Shell-Scripting beherrscht:

  • Ein Skript mit einer Shebang-Zeile erstellen und strukturieren.
  • Variablen verwenden, um ein Skript dynamisch zu machen.
  • Mit read Benutzereingaben erfassen.
  • Mit if-Anweisungen eine robuste Fehlerprüfung implementieren.
  • Wiederkehrende Aufgaben mit for-Schleifen automatisieren.
  • Dateiberechtigungen verwalten und ein Skript ausführen.

Ihr Skript kann nun automatisch prüfen, ob Logverzeichnisse vorhanden sind, alle Logdateien verarbeiten und sie an einen Sicherungsspeicherort kopieren. Das ist ein großer Schritt auf Ihrem Weg zum DevOps Engineer oder Systemadministrator. Die hier geübten Kenntnisse bilden die Grundlage für wesentlich komplexere Automatisierungsskripte, mit denen Sie Server verwalten, Anwendungen bereitstellen und Daten verarbeiten können. Sie haben bewiesen, dass Sie Verantwortung übernehmen und eine funktionierende Lösung liefern können. Sehr gut gemacht!

✨ Lösung prüfen und üben✨ Lösung prüfen und üben✨ Lösung prüfen und üben✨ Lösung prüfen und üben