Zwischen Aufgabe Bash

Aus Xinux Wiki
Version vom 25. November 2025, 16:02 Uhr von Thomas.will (Diskussion | Beiträge) (→‎Zusatz)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

Übungsaufgabe: Einfacher Webserver-Controller (webctl.sh)

  • In dieser Aufgabe soll ein kleines Bash-Skript einen Python-Webserver starten, stoppen und überwachen.
  • Dabei sollen grundlegende Kontrollstrukturen (case, if, for, while, until, break, continue, exit) verwendet werden.

Aufgabenstellung

  • Erstellen Sie ein Skript webctl.sh mit folgenden Befehlen:
  • start
  • stop
  • status
  • help

Anforderungen

start

  • Prüfen Sie mit if, ob python3 installiert ist, sonst exit 1.
  • Starten Sie den Webserver mit: python3 -m http.server 8000 &
  • Speichern Sie die PID in /tmp/web.pid.
  • Verwenden Sie eine kleine for-Schleife (3 Versuche), die beim zweiten Versuch mit break abbricht.

stop

  • Wenn die PID-Datei fehlt → Fehlermeldung und exit 2.
  • Mit einer while-Schleife kill auf die PID ausführen, solange der Prozess noch läuft.
  • Jeden zweiten Schleifendurchlauf mit continue überspringen.
  • Wenn der Prozess beendet ist → PID-Datei löschen.

status

  • Wenn PID-Datei vorhanden → prüfen, ob der Prozess läuft.
  • Wenn ja: "läuft" ausgeben.
  • Wenn nein: "nicht aktiv".

help

  • Liste der Befehle anzeigen.

Zusatz

  • Jeder Fehlerfall soll mit einem passenden exit-Code beendet werden.


 echo "python3 nicht gefunden"
 exit 1

fi

case "$CMD" in

 start)
   if [ -f "$PIDFILE" ]; then
     echo "Server läuft bereits"
     exit 3
   fi
   for i in 1 2 3; do
     echo "Starte... Versuch $i"
     if [ "$i" -eq 2 ]; then
       python3 -m http.server 8000 >/tmp/web.log 2>&1 &
       echo $! > "$PIDFILE"
       echo "Webserver gestartet"
       break
     fi
     sleep 1
   done
   ;;
 stop)
   if [ ! -f "$PIDFILE" ]; then
     echo "Kein Server gestartet"
     exit 2
   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 "nicht 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
   ;;
 *)
   echo "Unbekannter Befehl"
   exit 4
   ;;

esac

--->