У меня есть маршрутизатор, работающий uhttpd
по умолчанию, и есть процесс, который lighttpd
я хотел бы запустить вместо него. Поскольку оба процесса используют один и тот же порт, я хотел бы автоматически завершить uhttpd
и запустить его lighttpd
(настроив скрипт, содержащий команды, как cron
задание, которое запускается при перезагрузке).
Когда я запускаю команды, которые я хотел бы ввести в скрипт по отдельности, они работают. Когда я помещаю их в скрипт, я получаю сообщение об ошибке, сообщающее мне, что номер порта используется. Команды следующие:
killall uhttpd
/etc/init.d/lighttpd start
Вот простой сценарий, который у меня есть на данный момент:
#!/bin/sh
killall uhttpd
sleep 5 #To give the device time to release the port
/etc/init.d/lighttpd start
решение1
Я бы не стал ждать 5 секунд и надеяться, что это сработает, вы можете ждать слишком долго или слишком мало. Вы можете использовать nc -z
для проверки, используется ли порт (еще) и сделать следующее (я предполагаю, что они «борются» за порт 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
Если после 5-кратного ожидания процесс все еще не завершен, завершите его с большей силой и запускайте lighttpd только при свободном порте.
Вам следует проверить, не перезапускает ли что-то uhttpd (например, процесс, который запускает его в первую очередь). Возможно, sleep 5
используемый вами процесс оставляет достаточно времени для перезапуска (например, посмотрите на uhttpd
номер процесса до запуска скрипта и после).