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!
- Überspringe die Challenge vorübergehend und fahre mit den nachfolgenden geführten Labs im Linux-Lernpfad fort.
- 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.shim 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 +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 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
nanoverwenden, um die Datei zu erstellen und zu bearbeiten. Zum Beispiel:nano log_manager.sh. - Der Befehl
echowird verwendet, um eine Textzeile anzuzeigen. - Verwende
chmod +x Dateiname, um ein Skript ausführbar zu machen. Das+xfü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.shSkript. - 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, 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_DIRenthalten, die auf/home/labex/project/app_logsgesetzt ist. - Das Skript muss den Befehl
readverwenden, um Eingaben vom Benutzer zu erhalten. - Die Benutzereingabe muss in einer Variable namens
BACKUP_FILENAMEgespeichert werden. - Die endgültige Ausgabe muss die Variable
$BACKUP_FILENAMEverwenden.
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
readpausiert 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.shSkript. - Füge eine
if-Anweisung hinzu, um zu prüfen, ob das durch die Variable$LOG_DIRangegebene 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
-dprüfen. - 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 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 lautetif [ Bedingung ]; then ... else ... fi. - Der Test
[ -d "$VERZEICHNIS_PFAD" ]gibt wahr zurück, wenn$VERZEICHNIS_PFADexistiert und ein Verzeichnis ist. exit 1ist 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
backupsinnerhalb von~/project, in das die Log-Dateien kopiert werden. - Ändere dein
log_manager.shSkript. - Füge innerhalb des
if-Blocks (wo die Existenz des Verzeichnisses bestätigt wird) einefor-Schleife hinzu. - Die Schleife sollte über jede Datei iterieren, die im Verzeichnis
$LOG_DIRauf.logendet. - Verwende innerhalb der Schleife den Befehl
cp, um jede Log-Datei in das Verzeichnis~/project/backupszu 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_DIRdurchlaufen, die dem Muster*.logentsprechen. - Der Befehl
cpmuss innerhalb der Schleife verwendet werden, um Dateien nach~/project/backupszu 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
mkdirerstellen. - Eine
for-Schleife für Dateien kann so geschrieben werden:for file in /pfad/zu/*.log; do ... done. - Die Syntax des Befehls
cplautetcp <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!



