Reiniciar el enrutador OpenWRT periódicamente
Reiniciar el enrutador cada cierto tiempo nos sirve, por ejempplo, para que se limpie de procesos que puedan estar ocupando memoria de manera no deseada o simplemente para cambiar de IP pública.
Sin embargo, esto no es tan sencillo como parece, ya que el enrutador puede que no tenga un reloj interno que funcione en tiempo real. Esto podría provocar un ciclo interminable de reinicios.
Durante el arranque del enrutador, el reloj se configura inicialmente mediante “sysfixtime” con la marca de tiempo más reciente de cualquier archivo que se encuentre en /etc. Es decir, al inicio del arranque el router toma como hora la del archivo más moderno que se encuentre en /etc. El problema está en controlar que archivo es el más moderno, el cual puede ser un archivo de estado o un archivo de configuración, modificado quizás 30 segundos antes del reinicio iniciado por cron. En el proceso de arranque, el reloj toma la hora de ese archivo. A continuación el proceso cron se inicia y unos segundos más tarde nota que el momento de inicio requerido ha llegado de nuevo y se reinicia nuevamente entrando en bucle.
Si todo fuese bien, al final del proceso de arranque se inicia ntpd obteniendo la hora de internet, pero puede pasar un tiempo antes de que ntpd obtenga y establezca la hora correcta, por lo que cron puede iniciar de nuevo el reinicio en el medio cayendo en el bucle de reinicios.
Un truco que no sirve como solución es hacer un retraso de más de un minuto y crear a continuación un archivo en /etc justo antes de reiniciar. De esta forma, al reiniciarse y coger la hora del archivo más moderno, este tendría al menos más de un minuto por encima de la hora a la que se programó el reinicio, con lo cual evitamos que se vuelva a reiniciar.
# Reiniciar a las 4:30 a. m. todos los días # Nota: Para evitar un bucle de reinicio infinito, se espera 70 segundos # y se crea un archivo en /etc para configurar el reloj (touch /etc/banner) # que tendrá como hora de creación las 4:31 a.m. Así se evita el reinicio en bucle. 30 4 * * * sleep 70 && touch /etc/banner && reboot
Fijarse que el reinicio se programa a las 4:30, se esperan 70 segundo y se crea el fichero /etc/banner con esa hora de creación. En la práctica el reinicio se produce 70 segundos más tarde de lo programado, es decir, a las 4:31:10, por tanto, en el arranque se cogerá como hora inicial las 4:31:10, lo que asegura que no se vuelva a producir otro reinicio programado a las 4:30 y caer en un bucle de reinicios.
NOTA: En muchas plataformas
shutdown
no funciona como se espera, ya que simplemente detendrá la CPU pero no apagará el aparato.