Ich habe einen Router, der uhttpd
standardmäßig läuft, und es gibt einen Prozess, den lighttpd
ich stattdessen ausführen möchte. Da beide Prozesse denselben Port verwenden, möchte ich sie beenden uhttpd
und dann automatisch neu starten lighttpd
(indem ich das Skript, das die Befehle enthält, als Job einrichte, cron
der 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 -z
testen, 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 5
lässt der von Ihnen verwendete Prozess genügend Zeit für einen Neustart (sehen Sie sich z. B. die uhttpd
Prozessnummer an, bevor Sie Ihr Skript ausführen und danach).