Zwischen Aufgabe Bash

Aus Xinux Wiki
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…“)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

Ü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