Tengo un enrutador ejecutándose uhttpd
de forma predeterminada y hay un proceso que lighttpd
me gustaría ejecutar en su lugar. Dado que ambos procesos comparten el mismo puerto, me gustaría finalizar uhttpd
y luego iniciar lighttpd
automáticamente (configurando el script que contiene los comandos como un cron
trabajo que se ejecuta al reiniciar).
Cuando ejecuto los comandos que me gustaría ingresar al script individualmente, funcionan. Cuando los pongo en un script, aparece un mensaje de error que me indica que el número de puerto está en uso. Los comandos son:
killall uhttpd
/etc/init.d/lighttpd start
El script simple que tengo hasta ahora es:
#!/bin/sh
killall uhttpd
sleep 5 #To give the device time to release the port
/etc/init.d/lighttpd start
Respuesta1
No esperaría 5 segundos y espero que funcione, es posible que espere demasiado o demasiado poco. Puede utilizar nc -z
para probar si el puerto (todavía) se está utilizando y hacer lo siguiente (supongo que están "peleando" por el puerto 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
Si después de esperar 5 veces el proceso aún no finaliza, extráigalo con más fuerza y solo inicie lighttpd si el puerto está libre.
Deberías investigar si algo está reiniciando uhttpd (por ejemplo, el proceso que lo inicia en primer lugar). Tal vez el sleep 5
que está utilizando deje suficiente tiempo para reiniciarse (por ejemplo, mire el uhttpd
número de proceso antes de ejecutar el script y después).