Zwischen Aufgabe Bash: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
(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…“)
 
 
(2 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
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 ===
+
== Zusatz ==
*Mit einer until-Schleife soll gewartet werden, bis der Prozess nicht mehr läuft.
+
*Jeder Fehlerfall soll mit einem passenden exit-Code beendet werden.
*Alle zwei Sekunden soll "warte..." ausgegeben werden.
 
  
=== help-Funktion ===
+
<!---
*Gibt eine Übersicht der verfügbaren Befehle aus.
+
== Lösung (Kommentar) ==
 +
<pre>
 +
#!/bin/bash
 +
 
 +
CMD="$1"
 +
PIDFILE="/tmp/web.pid"
 +
 
 +
case "$CMD" in
 +
  help|"")
 +
    echo "Befehle: start | stop | status | help"
 +
    exit 0
 +
    ;;
 +
esac
 +
 
 +
if ! command -v python3 >/dev/null 2>&1; then= Ü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".
  
== Zusatzhinweis ==
+
=== help ===
*Alle Fehlerfälle sollen sinnvolle Meldungen und passende exit-Codes zurückgeben.
+
*Liste der Befehle anzeigen.
  
 +
== Zusatz ==
 +
*Jeder Fehlerfall soll mit einem passenden exit-Code beendet werden.
 +
 +
<!---
 
== Lösung (Kommentar) ==
 
== Lösung (Kommentar) ==
 
<pre>
 
<pre>
Zeile 53: Zeile 96:
  
 
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 89: Zeile 117:
 
     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 103: Zeile 132:
 
     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 124: Zeile 153:
 
   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 166:
 
     ;;
 
     ;;
  
   wait)
+
   *)
 +
    echo "Unbekannter Befehl"
 +
    exit 4
 +
    ;;
 +
esac
 +
</pre>
 +
--->
 +
 
 +
  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
 
     if [ ! -f "$PIDFILE" ]; then
       echo "kein Server aktiv"
+
       echo "Kein Server gestartet"
       exit 0
+
       exit 2
 
     fi
 
     fi
 +
 
     PID=$(cat "$PIDFILE")
 
     PID=$(cat "$PIDFILE")
 +
    COUNT=0
  
     until ! kill -0 "$PID" >/dev/null 2>&1; do
+
     while kill "$PID" >/dev/null 2>&1; do
       echo "warte..."
+
      COUNT=$((COUNT+1))
       sleep 2
+
      if [ $((COUNT % 2)) -eq 0 ]; then
 +
        continue
 +
      fi
 +
       echo "Beende Prozess..."
 +
       sleep 1
 
     done
 
     done
  
     echo "Prozess beendet"
+
     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 "Ungültiger Befehl"
+
     echo "Unbekannter Befehl"
     exit 3
+
     exit 4
 
     ;;
 
     ;;
 
esac
 
esac
 
</pre>
 
</pre>
 +
--->

Aktuelle Version vom 25. November 2025, 16:02 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.


 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

--->