TAG 10: Der Skript-Handwerker

LinuxBeginner
Jetzt üben

Einführung

Willkommen, angehender Systemadministrator! Du bist gerade als Junior DevOps Engineer in einem geschäftigen Technologieunternehmen eingestiegen. Dein erfahrener Kollege ist im wohlverdienten Urlaub, und eine kritische Aufgabe ist gerade auf deinem Schreibtisch gelandet. Der Haupt-Anwendungsserver generiert zahlreiche Log-Dateien, die schnell den Festplattenspeicher belegen. Deine Mission, solltest du sie annehmen, ist es, Der Skript-Handwerker zu werden.

Du musst 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. Du beginnst mit einem einfachen Skript und fügst nach und nach Funktionen wie Variablen, Benutzereingaben, Fehlerprüfung und Schleifen hinzu. Am Ende dieser Challenge wirst du ein Skript erstellt haben, das Dateien sichern und verwalten kann – damit beweist du deinen Wert für das Team und rettest den Tag!

Lass uns mit dem Skripten beginnen!

Wichtiger Hinweis
Die kommenden Challenges könnten den Rahmen des Kurses Quick Start with Linux überschreiten.
Falls du während der Challenge auf Schwierigkeiten stößt:
  1. Überspringe die Challenge vorübergehend und fahre mit den nachfolgenden geführten Labs im Linux-Lernpfad fort.
  2. Diskutiere mit Labby oder sieh dir die Lösung an.

Schreiben eines einfachen Shell-Skripts

Deine erste Aufgabe ist es, das Fundament zu legen. Jedes großartige 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 dein Setup korrekt ist und du bereit bist, komplexere Logik aufzubauen.

Aufgaben

  • Erstelle eine neue Shell-Skript-Datei namens log_manager.sh im Verzeichnis ~/project.
  • Füge ganz oben im Skript eine "Shebang"-Zeile (#!/bin/bash) hinzu. Dies teilt dem System mit, welcher Interpreter verwendet werden soll.
  • Füge einen Befehl hinzu, um die Nachricht "Log Manager Initialized." auf dem Bildschirm auszugeben.
  • Mache 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ührungsrechte verfügen (verwende chmod +x log_manager.sh).

Beispiele

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

Überprüfe zuerst, ob die Skriptdatei existiert:

ls ~/project/
log_manager.sh

Setze die Ausführungsrechte für das Skript:

chmod +x ~/project/log_manager.sh

Führe nun das Skript aus:

./log_manager.sh

Das Skript sollte Folgendes anzeigen:

Log Manager Initialized.

Du kannst auch überprüfen, ob der Inhalt des Skripts korrekt ist:

cat ~/project/log_manager.sh

Die Datei sollte enthalten:

#!/bin/bash

echo "Log Manager Initialized."

Tipps

  • Du kannst einen Kommandozeilen-Texteditor wie nano verwenden, um die Datei zu erstellen und zu bearbeiten. Zum Beispiel: nano log_manager.sh.
  • Der Befehl echo wird verwendet, um eine Textzeile anzuzeigen.
  • Verwende chmod +x Dateiname, um ein Skript ausführbar zu machen. Das +x fügt dem Dateieigentümer Ausführungsrechte hinzu.

Hinzufügen von Variablen und Benutzereingaben

Ein hartkodiertes Skript ist nicht sehr flexibel. Um dein Skript dynamischer und wiederverwendbarer zu machen, führst du nun Variablen ein. Du definierst eine Variable für das Log-Verzeichnis und fragst den Benutzer nach einem Label für den Backup-Lauf. Dadurch lässt sich das Skript an verschiedene Situationen anpassen, ohne den Code selbst ändern zu müssen.

Aufgaben

  • Ändere dein log_manager.sh Skript.
  • Definiere eine Variable namens LOG_DIR und weise ihr den Pfad /home/labex/project/app_logs zu.
  • 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 namens BACKUP_FILENAME zu speichern.
  • Füge einen abschließenden echo-Befehl hinzu, um die Einstellungen zu bestätigen, und zeige eine Nachricht wie "Backing up logs to: [filename]" an, wobei [filename] 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 Variable namens BACKUP_FILENAME gespeichert werden.
  • Die endgültige Ausgabe muss die Variable $BACKUP_FILENAME verwenden.

Beispiele

Wenn du das geänderte Skript ausführst, sollte es nach einer Benutzereingabe fragen und die Bestätigungsnachricht anzeigen. Die Interaktion sollte so aussehen:

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

Das Skript sollte bei der Aufforderung "Enter the backup filename:" anhalten und darauf warten, dass der Benutzer einen Namen eingibt und Enter drückt. Nachdem der Benutzer eine Eingabe gemacht hat, zeigt es die Bestätigungsnachricht mit dem eingegebenen Wert an. In dieser Challenge ist dieser Wert ein Lauf-Label, das in der Ausgabe angezeigt wird, während die eigentliche Backup-Aktion in Schritt 4 durch das Kopieren von .log-Dateien nach ~/project/backups implementiert wird.

Tipps

  • Um eine Variable zu definieren, verwende die Syntax VARIABLEN_NAME="Wert". Um das = Zeichen sollten keine Leerzeichen stehen.
  • Um den Wert einer Variable zu verwenden, stelle ihrem Namen ein $-Zeichen voran, wie $MEINE_VARIABLE.
  • Der Befehl read pausiert das Skript und wartet darauf, dass der Benutzer etwas tippt und Enter drückt.

Implementierung von bedingter Logik

Ein gutes Skript antizipiert Probleme. Was passiert, wenn das von dir angegebene Log-Verzeichnis nicht existiert? Das Skript würde fehlschlagen. Um dein Skript robuster zu machen, musst du bedingte Logik hinzufügen. Du verwendest eine if-Anweisung, um zu prüfen, ob das Log-Verzeichnis existiert, bevor du irgendwelche Operationen ausführst.

Aufgaben

  • Ändere dein log_manager.sh Skript.
  • Füge eine if-Anweisung hinzu, um zu prüfen, ob das durch die Variable $LOG_DIR angegebene Verzeichnis existiert.
  • Wenn das Verzeichnis existiert, sollte das Skript wie bisher fortfahren (nach Dateinamen fragen usw.).
  • Wenn das Verzeichnis nicht existiert, sollte 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 mit 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

Wenn das Log-Verzeichnis nicht existiert, sollte das Skript einen Fehler anzeigen und beendet werden:

./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 nach einer Benutzereingabe zu fragen oder mit Backup-Operationen fortzufahren.

Tipps

  • 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 eine Standardmethode, um zu signalisieren, dass ein Skript mit einem Fehler beendet wurde.

Schleifen durch Dateivorgänge

Jetzt zum Kern der Automatisierung! Du musst die Dateien im Log-Verzeichnis verarbeiten. Du verwendest eine for-Schleife, um alle Dateien zu durchlaufen, die im Verzeichnis app_logs auf .log enden. Für diese Challenge kopierst du sie einfach in ein neues Backup-Verzeichnis. Die Eingabe BACKUP_FILENAME bleibt ein Lauf-Label, das in der Ausgabe gedruckt wird, keine Archivdatei, die vom Skript erstellt wird.

Aufgaben

  • Erstelle zuerst ein Verzeichnis namens backups innerhalb von ~/project, in das die Log-Dateien kopiert werden.
  • Ändere dein log_manager.sh Skript.
  • Füge innerhalb des if-Blocks (wo die Existenz des Verzeichnisses bestätigt wird) eine for-Schleife hinzu.
  • Die Schleife sollte über jede Datei iterieren, die im Verzeichnis $LOG_DIR auf .log endet.
  • Verwende innerhalb der Schleife den Befehl cp, um jede Log-Datei in das Verzeichnis ~/project/backups zu kopieren.
  • Gib für jede kopierte Datei eine Nachricht wie "Copied [filename]" aus.

Anforderungen

  • Du musst zuerst das Verzeichnis ~/project/backups über die Befehlszeile 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 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: 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 "Copied"-Nachricht anzeigen. Die genauen Dateinamen hängen von den Log-Dateien ab, die in deinem app_logs-Verzeichnis vorhanden sind.

Nachdem das Skript abgeschlossen ist, kannst du überprüfen, ob die Dateien kopiert wurden, indem du das Verzeichnis backups prüfst:

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

Tipps

  • Du kannst ein Verzeichnis mit dem Befehl mkdir erstellen.
  • Eine for-Schleife für Dateien kann so geschrieben werden: for file in /pfad/zu/*.log; do ... done.
  • Die Syntax des Befehls cp 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-Handwerker! Du hast erfolgreich ein vollständiges, funktionsfähiges Shell-Skript von Grund auf neu erstellt. Du hast dich einem realen Problem gestellt – der Verwaltung von Log-Dateien – und es mit der Kraft der Automatisierung gelöst.

In dieser Challenge hast du mehrere grundlegende Konzepte des Shell-Skriptings gemeistert:

  • Erstellen und Strukturieren eines Skripts mit einem Shebang.
  • Verwendung von Variablen, um dein Skript dynamisch zu gestalten.
  • Erfassen von Benutzereingaben mit read.
  • Implementierung robuster Fehlerprüfung mit if-Anweisungen.
  • Automatisierung wiederkehrender Aufgaben mit for-Schleifen.
  • Verwalten von Dateiberechtigungen und Ausführen deines Skripts.

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