Eu tenho um roteador em execução uhttpd
por padrão e há um processo que lighttpd
gostaria de executar. Como ambos os processos compartilham a mesma porta, eu gostaria de encerrar uhttpd
e iniciar lighttpd
automaticamente (configurando o script que contém os comandos como um cron
trabalho executado na reinicialização).
Quando executo os comandos que gostaria de entrar no script individualmente, eles funcionam. Quando os coloco em um script, recebo uma mensagem de erro informando que o número da porta está em uso. Os comandos são:
killall uhttpd
/etc/init.d/lighttpd start
O script simples que tenho até agora é:
#!/bin/sh
killall uhttpd
sleep 5 #To give the device time to release the port
/etc/init.d/lighttpd start
Responder1
Eu não esperaria 5 segundos e espero que funcione, você pode esperar muito ou muito pouco. Você pode usar nc -z
para testar se a porta (ainda) está sendo usada e fazer o seguinte (presumo que eles estejam "brigando" pela porta 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
Se depois de esperar 5 vezes o processo ainda não for encerrado, expulse-o com mais força e só inicie o lighttpd se a porta estiver livre.
Você deve investigar se algo está reiniciando o uhttpd (por exemplo, o processo que o inicia). Talvez o que sleep 5
você está usando deixe tempo suficiente para reiniciar (por exemplo, observe o uhttpd
número do processo antes e depois de executar o script).