TAG 10: Der Skript-Kunsthandwerker

LinuxBeginner
Jetzt üben

Einführung

Willkommen, angehender Systemadministrator! Sie haben gerade als Junior DevOps Engineer bei einem florierenden Technologieunternehmen angefangen. Ihr erfahrener Kollege genießt seinen wohlverdienten Urlaub, und eine kritische Aufgabe ist gerade auf Ihrem Schreibtisch gelandet. Der Hauptanwendungsserver generiert zahlreiche Protokolldateien, die schnell den Speicherplatz auf der Festplatte verbrauchen. Ihre Mission, sollten Sie sie annehmen, ist es, zum Skript-Kunsthandwerker zu werden.

Sie müssen ein automatisiertes Shell-Skript erstellen, um diese Log-Dateien zu verwalten. Dabei geht es nicht nur darum, ein paar Befehle auszuführen; es geht darum, ein robustes, wiederverwendbares Werkzeug zu bauen. Sie beginnen mit einem einfachen Skript und fügen schrittweise Funktionen wie Variablen, Benutzereingaben, Fehlerprüfungen und Schleifen hinzu. Am Ende dieser Herausforderung werden Sie ein Skript erstellt haben, das Dateien sichern und verwalten kann – damit beweisen Sie Ihren Wert für das Team und retten den Tag!

Legen wir mit dem Skripten los!

Wichtiger Hinweis
Die kommenden Herausforderungen können über den Rahmen des Kurses Quick Start with Linux hinausgehen.
Falls Sie während der Herausforderung auf Schwierigkeiten stoßen:
  1. Überspringen Sie die Herausforderung vorübergehend und fahren Sie mit den nachfolgenden Guided Labs im Linux-Lernpfad fort.
  2. Diskutieren Sie mit Labby oder sehen Sie sich die Lösung an.

Ein einfaches Shell-Skript schreiben

Ihre erste Aufgabe besteht darin, das Fundament zu legen. Jedes großartige Skript beginnt mit einer einzigen Zeile. Sie müssen die Skriptdatei erstellen und einen einfachen Befehl hinzufügen, um sicherzustellen, dass sie korrekt funktioniert. Dieser erste Schritt bestätigt, dass Ihr Setup korrekt ist und Sie bereit sind, komplexere Logik aufzubauen.

Aufgaben

  • Erstellen Sie eine neue Shell-Skriptdatei namens log_manager.sh im Verzeichnis ~/project.
  • Fügen Sie ganz oben im Skript eine "Shebang"-Zeile (#!/bin/bash) ein. Diese teilt dem System mit, welcher Interpreter verwendet werden soll.
  • Fügen Sie einen Befehl hinzu, um die Nachricht "Log Manager Initialized." auf dem Bildschirm auszugeben.
  • 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 Nachricht anzuzeigen.
  • Das Skript muss über Ausführungsberechtigungen verfügen (verwenden Sie chmod +x log_manager.sh).

Beispiele

Nachdem Sie das Skript erstellt und ausführbar gemacht haben, sollte der gesamte Prozess wie folgt aussehen:

Überprüfen Sie zunächst, ob die Skriptdatei existiert:

ls ~/project/
log_manager.sh

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

chmod +x ~/project/log_manager.sh

Führen Sie nun das Skript aus:

./log_manager.sh

Das Skript sollte Folgendes anzeigen:

Log Manager Initialized.

Sie können auch ü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

  • Sie können einen Kommandozeilen-Texteditor wie nano verwenden, um die Datei zu erstellen und zu bearbeiten. Beispiel: nano log_manager.sh.
  • Der Befehl echo wird verwendet, um eine Textzeile anzuzeigen.
  • Verwenden Sie chmod +x dateiname, um ein Skript ausführbar zu machen. Das +x fügt Ausführungsberechtigungen für den Dateibesitzer hinzu.

Variablen und Benutzereingaben hinzufügen

Ein fest codiertes Skript ist nicht sehr flexibel. Um Ihr Skript dynamischer und wiederverwendbar zu machen, führen Sie nun Variablen ein. Sie definieren eine Variable für das Log-Verzeichnis und fordern den Benutzer auf, einen Namen für das Backup-Archiv einzugeben. Dadurch lässt sich das Skript an verschiedene Situationen anpassen, ohne den Code selbst ändern zu müssen.

Aufgaben

  • Ändern Sie Ihr Skript log_manager.sh.
  • Definieren Sie eine Variable namens 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 den Benutzer zur Eingabe aufzufordern.
  • Verwenden Sie den Befehl read, um die Eingabe des Benutzers in einer neuen Variablen namens BACKUP_FILENAME zu erfassen.
  • Fügen Sie einen abschließenden echo-Befehl hinzu, um die Einstellungen zu bestätigen. Geben Sie eine Nachricht wie "Backing up logs to: [dateiname]" aus, wobei [dateiname] der vom Benutzer eingegebene Wert ist.

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 vom Benutzer zu erhalten.
  • Die Benutzereingabe muss in einer Variablen namens BACKUP_FILENAME gespeichert werden.
  • Die endgültige Ausgabe muss die Variable $BACKUP_FILENAME verwenden.

Beispiele

Wenn Sie das geänderte Skript ausführen, sollte es zur Benutzereingabe auffordern und die Bestätigungsnachricht anzeigen. So sollte die Interaktion aussehen:

./log_manager.sh
Log Manager Initialized.
Enter the backup filename: my_backup_2024.tar.gz
Backing up logs to: my_backup_2024.tar.gz

Das Skript sollte bei der Aufforderung "Enter the backup filename:" pausieren und darauf warten, dass der Benutzer einen Dateinamen eingibt und die Eingabetaste drückt. Nachdem der Benutzer die Eingabe getätigt hat, zeigt es die Bestätigungsnachricht mit dem eingegebenen Dateinamen an.

Hinweise

  • Um eine Variable zu definieren, verwenden Sie die Syntax VARIABLEN_NAME="wert". Um das Gleichheitszeichen = dürfen keine Leerzeichen stehen.
  • Um den Wert einer Variablen zu verwenden, setzen Sie ein $-Zeichen vor ihren Namen, z. B. $MEINE_VARIABLE.
  • Der Befehl read pausiert das Skript und wartet darauf, dass der Benutzer etwas tippt und die Eingabetaste drückt.

Implementierung bedingter Logik

Ein gutes Skript antizipiert Probleme. Was passiert, wenn das von Ihnen angegebene Log-Verzeichnis nicht existiert? Das Skript würde fehlschlagen. Um Ihr Skript robuster zu machen, müssen Sie bedingte Logik hinzufügen. Sie verwenden eine if-Anweisung, um zu prüfen, ob das Log-Verzeichnis existiert, bevor Sie Operationen durchführen.

Aufgaben

  • Ändern Sie Ihr Skript log_manager.sh.
  • Fügen Sie eine if-Anweisung hinzu, um zu prüfen, ob das durch die Variable $LOG_DIR angegebene Verzeichnis existiert.
  • Wenn das Verzeichnis existiert, soll das Skript wie bisher fortfahren (Aufforderung zum Dateinamen usw.).
  • Wenn das Verzeichnis nicht existiert, soll das Skript eine 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 die Existenz eines Verzeichnisses mit dem Test-Operator -d prüfen.
  • Wenn das Verzeichnis nicht existiert, muss das Skript die angegebene Fehlermeldung per echo ausgeben.
  • Wenn das Verzeichnis nicht existiert, muss das Skript mit exit 1 beendet werden.

Beispiele

Wenn das Log-Verzeichnis existiert, sollte das Skript normal laufen:

./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

Falls das Log-Verzeichnis nicht existiert, sollte das Skript einen Fehler anzeigen und abbrechen:

./log_manager.sh
Log Manager Initialized.
Error: Log directory not found.

In diesem Fall wird das Skript sofort nach der Anzeige der Fehlermeldung beendet, ohne zur Benutzereingabe aufzufordern oder Backup-Operationen durchzuführen.

Hinweise

  • Die Syntax für eine einfache if-Anweisung lautet if [ bedingung ]; then ... else ... fi.
  • Der Test [ -d "$VERZEICHNIS_PFAD" ] gibt wahr zurück, wenn $VERZEICHNIS_PFAD existiert und ein Verzeichnis ist.
  • exit 1 ist ein Standardweg, um zu signalisieren, dass ein Skript mit einem Fehler beendet wurde.

Schleifen für Dateioperationen nutzen

Jetzt kommen wir zum Kern der Automatisierung! Sie müssen die Dateien im Log-Verzeichnis verarbeiten. Sie verwenden eine for-Schleife, um über alle Dateien im Verzeichnis app_logs zu iterieren, die auf .log enden. In dieser Herausforderung werden Sie diese einfach in ein neues Backup-Verzeichnis kopieren.

Aufgaben

  • Erstellen Sie zuerst ein Verzeichnis namens backups innerhalb von ~/project, in das die Log-Dateien kopiert werden sollen.
  • Ändern Sie Ihr Skript log_manager.sh.
  • Fügen Sie innerhalb des if-Blocks (dort, wo die Existenz des Verzeichnisses bestätigt wurde) eine for-Schleife hinzu.
  • Die Schleife soll über jede Datei im Verzeichnis $LOG_DIR iterieren, die auf .log endet.
  • Verwenden Sie innerhalb der Schleife den Befehl cp, um jede Log-Datei in das Verzeichnis ~/project/backups zu kopieren.
  • Geben Sie für jede kopierte Datei eine Nachricht wie "Copied [dateiname]" aus.

Anforderungen

  • Sie müssen zuerst das Verzeichnis ~/project/backups über die Kommandozeile erstellen.
  • Das Skript muss eine for-Schleife verwenden.
  • Die Schleife muss über Dateien in $LOG_DIR iterieren, 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 den Namen jeder Datei melden, während sie kopiert wird.

Beispiele

Nach Abschluss dieses Schritts sollte das Skript beim Ausführen mit einem Backup-Dateinamen alle Log-Dateien verarbeiten und eine Ausgabe ähnlich der folgenden anzeigen:

./log_manager.sh
Log Manager Initialized.
Log directory found. Proceeding...
Enter the backup filename: full_backup.tar.gz
Backing up logs to: full_backup.tar.gz
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 "Copied"-Nachricht anzeigen. Die genauen Dateinamen hängen von den in Ihrem app_logs-Verzeichnis vorhandenen Log-Dateien ab.

Nachdem das Skript abgeschlossen ist, können Sie überprüfen, ob die Dateien kopiert wurden, indem Sie das backups-Verzeichnis kontrollieren:

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

Hinweise

  • Sie können ein Verzeichnis mit dem Befehl mkdir erstellen.
  • Eine for-Schleife für Dateien kann als for file in /pfad/zu/*.log; do ... done geschrieben werden.
  • Die Syntax für den cp-Befehl lautet cp <quelle> <ziel>.
  • Die Schleifenvariable (z. B. file) enthält bei jeder Iteration den vollständigen Pfad zur Datei.

Zusammenfassung

Herzlichen Glückwunsch, Skript-Kunsthandwerker! Sie haben erfolgreich ein vollständiges, funktionales Shell-Skript von Grund auf neu erstellt. Sie haben sich einem realen Problem gestellt – der Verwaltung von Log-Dateien – und es mit der Kraft der Automatisierung gelöst.

In dieser Herausforderung haben Sie mehrere grundlegende Konzepte des Shell-Scripting gemeistert:

  • Erstellen und Strukturieren eines Skripts mit einer Shebang-Zeile.
  • Verwendung von Variablen, um Ihr Skript dynamisch zu gestalten.
  • Erfassen von Benutzereingaben mit read.
  • Implementierung einer robusten Fehlerprüfung mit if-Anweisungen.
  • Automatisierung sich wiederholender Aufgaben mit for-Schleifen.
  • Verwaltung von Dateiberechtigungen und Ausführung Ihres Skripts.

Ihr Skript kann nun automatisch die Existenz von Log-Verzeichnissen prüfen, alle Log-Dateien verarbeiten und sie an einen Backup-Ort kopieren. Dies ist ein riesiger Schritt auf Ihrem Weg als DevOps Engineer oder Systemadministrator. Die Fähigkeiten, die Sie hier geübt haben, bilden die Grundlage für das Schreiben weitaus komplexerer Automatisierungsskripte, die Server verwalten, Anwendungen bereitstellen und Daten verarbeiten können. Sie haben bewiesen, dass Sie Verantwortung übernehmen und eine funktionierende Lösung liefern können. 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