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!
- Überspringen Sie die Herausforderung vorübergehend und fahren Sie mit den nachfolgenden Guided Labs im Linux-Lernpfad fort.
- 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.shim 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 +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ü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
nanoverwenden, um die Datei zu erstellen und zu bearbeiten. Beispiel:nano log_manager.sh. - Der Befehl
echowird verwendet, um eine Textzeile anzuzeigen. - Verwenden Sie
chmod +x dateiname, um ein Skript ausführbar zu machen. Das+xfü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_DIRund weisen Sie ihr den Pfad/home/labex/project/app_logszu. - 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 namensBACKUP_FILENAMEzu 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_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 Variablen namens
BACKUP_FILENAMEgespeichert werden. - Die endgültige Ausgabe muss die Variable
$BACKUP_FILENAMEverwenden.
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
readpausiert 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_DIRangegebene 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
-dprüfen. - Wenn das Verzeichnis nicht existiert, muss das Skript die angegebene Fehlermeldung per
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
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 lautetif [ bedingung ]; then ... else ... fi. - Der Test
[ -d "$VERZEICHNIS_PFAD" ]gibt wahr zurück, wenn$VERZEICHNIS_PFADexistiert und ein Verzeichnis ist. exit 1ist 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
backupsinnerhalb 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) einefor-Schleife hinzu. - Die Schleife soll über jede Datei im Verzeichnis
$LOG_DIRiterieren, die auf.logendet. - Verwenden Sie innerhalb der Schleife den Befehl
cp, um jede Log-Datei in das Verzeichnis~/project/backupszu 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_DIRiterieren, 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: 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
mkdirerstellen. - Eine
for-Schleife für Dateien kann alsfor file in /pfad/zu/*.log; do ... donegeschrieben werden. - Die Syntax für den
cp-Befehl lautetcp <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!



