Zwischen Aufgabe Bash: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
Zeile 1: Zeile 1:
= Übungsaufgabe: Webserver-Steuerung mit Bash (webctl.sh) =
+
= Übungsaufgabe: Einfacher Webserver-Controller (webctl.sh) =
  
*In dieser Aufgabe soll ein Bash-Skript einen lokalen Python-Webserver starten, stoppen, überwachen und den Status anzeigen.
+
*In dieser Aufgabe soll ein kleines Bash-Skript einen Python-Webserver starten, stoppen und überwachen.
*Dabei sollen die in der Bash verfügbaren Kontrollstrukturen wie case, if, for, while, until, continue, break und exit sinnvoll eingesetzt werden.
+
*Dabei sollen grundlegende Kontrollstrukturen (case, if, for, while, until, break, continue, exit) verwendet werden.
  
 
== Aufgabenstellung ==
 
== Aufgabenstellung ==
  
 
*Erstellen Sie ein Skript '''webctl.sh''' mit folgenden Befehlen:
 
*Erstellen Sie ein Skript '''webctl.sh''' mit folgenden Befehlen:
* start PORT
+
* start
 
* stop
 
* stop
 
* status
 
* status
* wait
 
 
* help
 
* help
  
 
== Anforderungen ==
 
== Anforderungen ==
  
=== Argument- und Umgebungsprüfung ===
+
=== start ===
*Bei allen Befehlen außer help muss geprüft werden, ob '''python3''' installiert ist.
+
*Prüfen Sie mit if, ob python3 installiert ist, sonst exit 1.
*Beim Befehl start muss ein gültiger Port (1024–65535) angegeben werden.
+
*Starten Sie den Webserver mit: python3 -m http.server 8000 &
*Ungültige Eingaben sollen mit exit 1, fehlende Python-Installation mit exit 2 quittiert werden.
+
*Speichern Sie die PID in /tmp/web.pid.
 +
*Verwenden Sie eine kleine for-Schleife (3 Versuche), die beim zweiten Versuch mit break abbricht.
  
=== start-Funktion ===
+
=== stop ===
*Wenn bereits ein Webserver läuft (PID-Datei /tmp/web.pid existiert), soll ein Fehler ausgegeben werden (exit 3).
+
*Wenn die PID-Datei fehlt → Fehlermeldung und exit 2.
*Der Startvorgang besteht aus einer for-Schleife über fünf Versuche.
+
*Mit einer while-Schleife kill auf die PID ausführen, solange der Prozess noch läuft.
*Beim dritten Versuch soll der Webserver mit python3 -m http.server PORT im Hintergrund gestartet werden.
+
*Jeden zweiten Schleifendurchlauf mit continue überspringen.
*Die PID soll in /tmp/web.pid gespeichert werden und die Schleife mit break verlassen werden.
+
*Wenn der Prozess beendet ist → PID-Datei löschen.
*Abschluss: Ausgabe "Webserver gestartet".
 
  
=== stop-Funktion ===
+
=== status ===
*Wenn keine PID-Datei existiert, soll das Skript mit exit 4 enden.
+
*Wenn PID-Datei vorhanden → prüfen, ob der Prozess läuft.
*Mit einer while-Schleife soll der Prozess beendet werden, solange kill erfolgreich ist.
+
*Wenn ja: "läuft" ausgeben.
*Jeder zweite Schleifendurchlauf soll mit continue übersprungen werden.
+
*Wenn nein: "nicht aktiv".
*Nach erfolgreichem Stoppen: PID-Datei löschen und "gestoppt" ausgeben.
 
  
=== status-Funktion ===
+
=== help ===
*Wenn eine PID-Datei existiert, prüfen Sie, ob der Prozess noch läuft.
+
*Liste der Befehle anzeigen.
*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.
 
  
 +
== Zusatz ==
 +
*Jeder Fehlerfall soll mit einem passenden exit-Code beendet werden.
  
 
<!---
 
<!---
Zeile 55: Zeile 43:
  
 
CMD="$1"
 
CMD="$1"
PORT="$2"
 
 
PIDFILE="/tmp/web.pid"
 
PIDFILE="/tmp/web.pid"
LOGFILE="/tmp/web.log"
 
  
 
case "$CMD" in
 
case "$CMD" in
 
   help|"")
 
   help|"")
     echo "Befehle: start PORT | stop | status | wait | help"
+
     echo "Befehle: start | stop | status | help"
 
     exit 0
 
     exit 0
 
     ;;
 
     ;;
 
esac
 
esac
  
command -v python3 >/dev/null 2>&1
+
if ! command -v python3 >/dev/null 2>&1; then
if [ $? -ne 0 ]; then
 
 
   echo "python3 nicht gefunden"
 
   echo "python3 nicht gefunden"
   exit 2
+
   exit 1
 
fi
 
fi
  
 
case "$CMD" in
 
case "$CMD" in
 
   start)
 
   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
 
     if [ -f "$PIDFILE" ]; then
 
       echo "Server läuft bereits"
 
       echo "Server läuft bereits"
Zeile 91: Zeile 64:
 
     fi
 
     fi
  
     for i in 1 2 3 4 5; do
+
     for i in 1 2 3; do
 
       echo "Starte... Versuch $i"
 
       echo "Starte... Versuch $i"
       if [ "$i" -eq 3 ]; then
+
       if [ "$i" -eq 2 ]; then
         python3 -m http.server "$PORT" >"$LOGFILE" 2>&1 &
+
         python3 -m http.server 8000 >/tmp/web.log 2>&1 &
 
         echo $! > "$PIDFILE"
 
         echo $! > "$PIDFILE"
 
         echo "Webserver gestartet"
 
         echo "Webserver gestartet"
 
         break
 
         break
 
       fi
 
       fi
 +
      sleep 1
 
     done
 
     done
 
     ;;
 
     ;;
Zeile 105: Zeile 79:
 
     if [ ! -f "$PIDFILE" ]; then
 
     if [ ! -f "$PIDFILE" ]; then
 
       echo "Kein Server gestartet"
 
       echo "Kein Server gestartet"
       exit 4
+
       exit 2
 
     fi
 
     fi
  
 
     PID=$(cat "$PIDFILE")
 
     PID=$(cat "$PIDFILE")
 +
    COUNT=0
  
    COUNT=0
 
 
     while kill "$PID" >/dev/null 2>&1; do
 
     while kill "$PID" >/dev/null 2>&1; do
 
       COUNT=$((COUNT+1))
 
       COUNT=$((COUNT+1))
Zeile 126: Zeile 100:
 
   status)
 
   status)
 
     if [ ! -f "$PIDFILE" ]; then
 
     if [ ! -f "$PIDFILE" ]; then
       echo "kein Server aktiv"
+
       echo "nicht aktiv"
 
       exit 0
 
       exit 0
 
     fi
 
     fi
 +
 
     PID=$(cat "$PIDFILE")
 
     PID=$(cat "$PIDFILE")
 +
 
     if kill -0 "$PID" >/dev/null 2>&1; then
 
     if kill -0 "$PID" >/dev/null 2>&1; then
 
       echo "läuft"
 
       echo "läuft"
Zeile 135: Zeile 111:
 
       echo "PID existiert, aber Prozess tot"
 
       echo "PID existiert, aber Prozess tot"
 
     fi
 
     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"
+
     echo "Unbekannter Befehl"
     exit 3
+
     exit 4
 
     ;;
 
     ;;
 
esac
 
esac
 
</pre>
 
</pre>
 
--->
 
--->

Version vom 25. November 2025, 16:00 Uhr

Ü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.