Hardware > Ordenadores

[Ayuda] BASH para reiniciar la RasPi

(1/6) > >>

vixium:
Buenas tardes,

Tengo una PCE conectada a una RasPi y tengo un problema de desconexiones que se solucionan reiniciando todo. He conseguido que al reiniciar la RasPi se reinicie también la consola de la PCE, así que ya lo único que me queda para no perder los datos con estos cortes es automatizar el proceso.

Por ello, necesito ayuda para programar un bash en linux que se ejecute cada minuto (se mete en el crontab) y que éste compare el fichero realtime.txt que utiliza cumulusMX. Detallo más la teoría:

- Tengo un fichero realtime.txt que contiene la fecha, la hora y todos los valores registrados por la estación.
- Este fichero se sobreescribe con datos nuevos cada minuto.

La idea es guardar los datos de los 3 últimos ficheros (3 minutos) y comparar si la velocidad del viento, temperatura, humedad, etc son idénticos.

--> Si son idénticos: la estación ha perdido señal y el realtime solo está actualizando la hora, pero no los datos de sensores, porque se ha quedado con el último valor. Por lo tanto: reboot.
--> Si son diferentes: no hacer nada.

Ya digo, la teoría es facil, pero no tengo ni tiempo ni conocimiento para hacerlo. ¿alguien que controle me puede ayudar?¿a alguien se le ocurre otra solución?

Gracias!!

jmviper:
Hola vixium

Sí se puede hacer... en programación prácticamente todo es posible... he creado el bash con lo poco que me sé (y googleando un rato  *+* *+*) y debo de decir que probándolo funciona...

El problema es que hay que restringir muuuucho los campos a leer del realtime.txt que genera Cumulus… explico... algunos campos aunque se pierda la señal del viento pueden ir siendo alterados (o tardar tiempo en serlo) por Cumulus como el Rain rate o la velocidad media del viento por lo que no serían exactamente "iguales".

El script es este:


--- Código: ---#!/bin/bash

realtime='/etc/CumulusMX/realtime.txt'
check='/home/pi/cumuluscheck.txt'

cat $realtime | cut -d ' ' -f 3-5,7-8 >> $check
lineas=$(wc -l < $check)
lineas2=$(uniq $check | wc -l)
if [[ $lineas == 4 ]]
then sed -i '1d' $check
elif [[ $lineas -lt 3 ]]
then exit
fi
if [[ $lineas2 == 1 ]]
then rm $check
     reboot
fi
--- Fin del código ---

Te lo comento un poco.

al principio en realtime= y en check= aparecen las rutas (siempre éstas entre comillas) donde se encuentra el archivo realtime de Cumulus MX (depende de dónde lo hayas puesto) y del archivo que servirá para comparar líneas que se ubicará por defecto en /home/pi

Comparará sólo los campos de temperatura, humedad, punto de rocío y velocidad y dirección del viento. El peligro de esto es que si por ejemplo tu estación está 3 minutos con la misma temperatura, humedad y por ejemplo el viento está a 0 km/h que puede fácilmente darse en situaciones de inversión térmica en las que no hay casi variación el script haría que se reiniciase la raspi.

Yo, en vez de cada minuto pondría que cada 3 ó cada 5 minutos comparase los 3 registros (se puede variar el número de registros a comparar)

Si creas el archivo con nano hazlo con sudo delante para que sea propiedad de root y ponle permisos de ejecución con sudo chmod +x nombredelarchivo (que deberá terminar en extensión .sh)

Ponlo en el crontab de root (sudo crontab -e), por ejemplo */3 * * * * rutadelarchivobash ejecutaría el script cada 3 minutos por lo que si en esos 9 minutos esos valores son inguales en todas las líneas reiniciaría la Raspi.

Si tienes alguna duda o quieres saber algo por aquí estoy

saludos

vixium:
Acabo de verlo, estoy pendiente de probarlo en cuanto tenga un hueco libre (este finde pretendo ponerme un rato con este tema).

Muchísimas gracias!! os comentaré las novedades!

Un saludo

vixium:
Probado y funcionando.

He modificado algunas cosas, he metido más variables (6 en total: temperatura, humedad, punto de rocío, velocidad media, racha máxima y dirección de viento)

También he modificado el número de líneas a escribir en el fichero (de 3 a 5).

En resumen, se ejecuta cada 2 minutos y guardo las 5 últimas ejecuciones del script. Si todas son iguales (10 minutos con las mismas medidas de las 6 variables), reinicio.

Gracias a todos y en especial a jmviper!
Un saludo

jmviper:
Ok puedes modificarlo a tu gusto.

La velocidad media del viento se quedaría al cabo de poco tiempo igual a la racha actual si ésta se quedase estancada.

En cuanto a ponerlo a 5 registros habrás tenido que modificar los condicionales del script de esta manera:


--- Código: ---if [[ $lineas == 6 ]]
then sed -i '1d' $check
elif [[ $lineas -lt 5 ]]
then exit
fi
if [[ $lineas2 == 1 ]]
then rm $check
     reboot
fi

--- Fin del código ---

Que te funcione como se espera  ;)

saludos

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa