Wie erstelle ich ein einfaches Skript, um uhttpd zu beenden und dann lighttpd zu starten?

Wie erstelle ich ein einfaches Skript, um uhttpd zu beenden und dann lighttpd zu starten?

Ich habe einen Router, der uhttpdstandardmäßig läuft, und es gibt einen Prozess, den lighttpdich stattdessen ausführen möchte. Da beide Prozesse denselben Port verwenden, möchte ich sie beenden uhttpdund dann automatisch neu starten lighttpd(indem ich das Skript, das die Befehle enthält, als Job einrichte, cronder beim Neustart ausgeführt wird).

Wenn ich die Befehle ausführe, die ich einzeln in das Skript eingeben möchte, funktionieren sie. Wenn ich sie in ein Skript einfüge, erhalte ich eine Fehlermeldung, die mir mitteilt, dass die Portnummer verwendet wird. Die Befehle lauten:

killall uhttpd

/etc/init.d/lighttpd start

Das einfache Skript, das ich bisher habe, ist:

#!/bin/sh
killall uhttpd
sleep 5 #To give the device time to release the port
/etc/init.d/lighttpd start

Antwort1

Ich würde nicht 5 Sekunden warten und hoffen, dass es klappt. Vielleicht wartest du zu lange oder zu kurz. Du kannst nc -ztesten, ob der Port (noch) verwendet wird, und Folgendes tun (ich nehme an, sie „streiten“ sich um Port 80):

#!/bin/bash

for i in $(seq 5); do
  if ! nc -z localhost 80; then
      break
  fi
  echo $i
  sleep 1
done

if nc -z localhost 80; then
    killall -9 uhttpd
    sleep 1
fi

if ! nc -z localhost 80; then
    /etc/init.d/lighttpd start
else
    echo 'port not free'
fi

Wenn der Prozess nach fünfmaligem Warten immer noch nicht beendet wurde, beenden Sie ihn mit mehr Nachdruck und starten Sie lighttpd nur, wenn der Port frei ist.

Sie sollten untersuchen, ob uhttpd durch etwas neu gestartet wird (z. B. den Prozess, der es überhaupt erst startet). Vielleicht sleep 5lässt der von Ihnen verwendete Prozess genügend Zeit für einen Neustart (sehen Sie sich z. B. die uhttpdProzessnummer an, bevor Sie Ihr Skript ausführen und danach).

verwandte Informationen