Zwischen Aufgabe Bash: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
(→Zusatz) |
|||
| Zeile 1: | Zeile 1: | ||
= Übungsaufgabe: Einfacher Webserver-Controller (webctl.sh) = | = Ü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. | ||
| + | |||
| + | <!--- | ||
| + | == 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. | *In dieser Aufgabe soll ein kleines Bash-Skript einen Python-Webserver starten, stoppen und überwachen. | ||
| Zeile 53: | Zeile 106: | ||
if ! command -v python3 >/dev/null 2>&1; then | if ! command -v python3 >/dev/null 2>&1; then | ||
| + | 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 | ||
| + | </pre> | ||
| + | ---> | ||
| + | |||
echo "python3 nicht gefunden" | echo "python3 nicht gefunden" | ||
exit 1 | exit 1 | ||
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
--->