Zwischen Aufgabe Bash
Version vom 25. November 2025, 15:56 Uhr von Thomas.will (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „= Übungsaufgabe: Webserver-Steuerung mit Bash (webctl.sh) = *In dieser Aufgabe soll ein Bash-Skript einen lokalen Python-Webserver starten, stoppen, überwac…“)
Übungsaufgabe: Webserver-Steuerung mit Bash (webctl.sh)
- In dieser Aufgabe soll ein Bash-Skript einen lokalen Python-Webserver starten, stoppen, überwachen und den Status anzeigen.
- Dabei sollen die in der Bash verfügbaren Kontrollstrukturen wie case, if, for, while, until, continue, break und exit sinnvoll eingesetzt werden.
Aufgabenstellung
- Erstellen Sie ein Skript webctl.sh mit folgenden Befehlen:
- start PORT
- stop
- status
- wait
- help
Anforderungen
Argument- und Umgebungsprüfung
- Bei allen Befehlen außer help muss geprüft werden, ob python3 installiert ist.
- Beim Befehl start muss ein gültiger Port (1024–65535) angegeben werden.
- Ungültige Eingaben sollen mit exit 1, fehlende Python-Installation mit exit 2 quittiert werden.
start-Funktion
- Wenn bereits ein Webserver läuft (PID-Datei /tmp/web.pid existiert), soll ein Fehler ausgegeben werden (exit 3).
- Der Startvorgang besteht aus einer for-Schleife über fünf Versuche.
- Beim dritten Versuch soll der Webserver mit python3 -m http.server PORT im Hintergrund gestartet werden.
- Die PID soll in /tmp/web.pid gespeichert werden und die Schleife mit break verlassen werden.
- Abschluss: Ausgabe "Webserver gestartet".
stop-Funktion
- Wenn keine PID-Datei existiert, soll das Skript mit exit 4 enden.
- Mit einer while-Schleife soll der Prozess beendet werden, solange kill erfolgreich ist.
- Jeder zweite Schleifendurchlauf soll mit continue übersprungen werden.
- Nach erfolgreichem Stoppen: PID-Datei löschen und "gestoppt" ausgeben.
status-Funktion
- Wenn eine PID-Datei existiert, prüfen Sie, ob der Prozess noch läuft.
- Wenn er läuft: Ausgabe "läuft".
- Wenn nicht: Ausgabe "PID existiert, aber Prozess tot".
wait-Funktion
- Mit einer until-Schleife soll gewartet werden, bis der Prozess nicht mehr läuft.
- Alle zwei Sekunden soll "warte..." ausgegeben werden.
help-Funktion
- Gibt eine Übersicht der verfügbaren Befehle aus.
Zusatzhinweis
- Alle Fehlerfälle sollen sinnvolle Meldungen und passende exit-Codes zurückgeben.
Lösung (Kommentar)
#!/bin/bash
CMD="$1"
PORT="$2"
PIDFILE="/tmp/web.pid"
LOGFILE="/tmp/web.log"
case "$CMD" in
help|"")
echo "Befehle: start PORT | stop | status | wait | help"
exit 0
;;
esac
command -v python3 >/dev/null 2>&1
if [ $? -ne 0 ]; then
echo "python3 nicht gefunden"
exit 2
fi
case "$CMD" in
start)
if [ -z "$PORT" ]; then
echo "Port fehlt"
exit 1
fi
if ! echo "$PORT" | grep -Eq '^[0-9]+$'; then
echo "Ungültiger Port"
exit 1
fi
if [ "$PORT" -lt 1024 ] || [ "$PORT" -gt 65535 ]; then
echo "Port außerhalb des Bereichs"
exit 1
fi
if [ -f "$PIDFILE" ]; then
echo "Server läuft bereits"
exit 3
fi
for i in 1 2 3 4 5; do
echo "Starte... Versuch $i"
if [ "$i" -eq 3 ]; then
python3 -m http.server "$PORT" >"$LOGFILE" 2>&1 &
echo $! > "$PIDFILE"
echo "Webserver gestartet"
break
fi
done
;;
stop)
if [ ! -f "$PIDFILE" ]; then
echo "Kein Server gestartet"
exit 4
fi
PID=$(cat "$PIDFILE")
COUNT=0
while kill "$PID" >/dev/null 2>&1; do
COUNT=$((COUNT+1))
if [ $((COUNT % 2)) -eq 0 ]; then
continue
fi
echo "Beende Prozess..."
sleep 1
done
rm -f "$PIDFILE"
echo "gestoppt"
;;
status)
if [ ! -f "$PIDFILE" ]; then
echo "kein Server aktiv"
exit 0
fi
PID=$(cat "$PIDFILE")
if kill -0 "$PID" >/dev/null 2>&1; then
echo "läuft"
else
echo "PID existiert, aber Prozess tot"
fi
;;
wait)
if [ ! -f "$PIDFILE" ]; then
echo "kein Server aktiv"
exit 0
fi
PID=$(cat "$PIDFILE")
until ! kill -0 "$PID" >/dev/null 2>&1; do
echo "warte..."
sleep 2
done
echo "Prozess beendet"
;;
*)
echo "Ungültiger Befehl"
exit 3
;;
esac