Normalmente, hago una revisión/mantenimiento de mi Raspberry Pi cada viernes.
Compruebo que todo está ok, compruebo que los backups de archivos importantes están realizados, hago limpieza de archivos innecesarios e incluso actualizo el sistema.
Un comando que uso para comprobar el tiempo que el equipo lleva encendido es:
uptime -p
Cual fue mi sorpresa, cuando compruebo que en lugar de los 11 meses y 13 días que debería de llevar encendida, el resultado es de 2 días y unas horas. Parece ser que el pasado viernes 31 de octubre se reinició automáticamente, sin que yo lo supiese.
No me dí cuenta, porque el reinicio ocurrió de madrugada, y tras recuperar todos los servicios, todo volvió a la normalidad.
Con el comando:
last reboot
Puedes ver los últimos reinicios del sistema.
Tras comprobar que efectivamente, el equipo se reinició, investigo un poco más.
Para saber por qué se reinició la Raspberry Pi, revisé los logs del sistema donde se registran eventos, errores y causas de posibles de reinicios.
sudo journalctl -b -1
Este comando muestra el registro completo desde el arranque anterior (antes del último reinicio).
El log es muy grande y hay mucho que procesar, así que con ayuda de la IA (en mi caso usé Perplexity), descubrí que:
- El sistema de archivos FAT de la partición de arranque estaba "sucio" (dirty bit set), y que no fue desmontado correctamente, lo que suele ocurrir tras un apagón o reinicio brusco.
- El sistema automáticamente limpió ese "dirty bit" y corrigió algunas diferencias entre la copia del sector de arranque y su respaldo.
- Un mensaje preocupante era "mmc0: Card stuck being busy!" que indicaba que la tarjeta SD (medio de almacenamiento) tuvo problemas para responder correctamente, probablemente bloqueándose momentáneamente.
- También había varios errores relacionados con el proceso th-cmd de udev fallando repetidamente.
En síntesis, el reinicio probablemente fue causado por un fallo de hardware o un problema momentáneo en la tarjeta SD o su controlador, que puede haber provocado una interrupción en la actividad de escritura o lectura y que forzó un reinicio del sistema. Este tipo de eventos causa que el sistema detecte archivos corruptos y necesite hacer reparaciones al iniciar.
La IA me dió algunas recomendaciones para evitar más fallos, pero como la tarjeta apenas tiene un año desde que la compré, he decidido dejarla tal cual y seguir adelante con ella sin hacerle nada, esperando que no vuelva a fallar.
La cuestión es que si que se me ha ocurrido que la próxima vez que ocurra esto, quiero estar alertado, así que he desarrollado un sistema que me avisará con un mensaje utilizando la aplicación Telegram que tengo instalada en mi teléfono.
Y ¿cómo lo he hecho?
Lo primero que necesitamos es tener una cuenta activa de Telegram. Yo la tengo en el móvil y en mi sesión de Windows.
Ahora vayamos paso a paso:
Paso 1: Crear el bot en Telegram y obtener el token
- Abre Telegram en tu móvil o PC.
- Busca el usuario @BotFather y abre el chat.
- Envía el comando /newbot.
- BotFather te pedirá un nombre para el bot. Elige uno visible, ejemplo: "AlertaPiBot". Puede que ese nombre ya esté en uso, a mi me pasó, así que elije otro.
- Luego elige un nombre de usuario para el bot que termine en bot, por ejemplo: alerta_pibot. Tiene que acabar en "bot" si o si.
- Al terminar, BotFather te enviará un token: una cadena larga con números y letras. Guárdalo, lo necesitarás más adelante.
- BotFather también te dará un enlace para entrar en tu nuevo bot, sale justo encima del token. Pulsa el enlace y cuando se abra, actívalo pulsando START.
- Escribe cualquier cosa en tu bot y pulsa Enter para enviar el mensaje. Esto es necesario para que el bot esté activo del todo y cuando lo probemos haya respuesta.
Paso 2: Obtener tu chat ID
Para recibir mensajes en Telegram, necesitas saber el chat ID (ya sea tu chat con el bot o un grupo):
- Busca y abre el bot @userinfobot en Telegram. Ojo de no usar otros bots con nombres muy parecidos, que los hay.
- Envía cualquier mensaje al bot.
- El bot te responderá con tu chat ID. Copia ese número.
Paso 3: Crear el script de alerta en Raspberry Pi
En tu Raspberry Pi, crea un archivo de script para enviar mensajes por Telegram.
Abre la terminal y escribe:
sudo nano /usr/local/bin/alerta_telegram.sh
Copia y pega este contenido, sustituyendo TU_BOT_TOKEN_AQUI y TU_CHAT_ID_AQUI por los valores que obtuviste:
#!/bin/bashBOT_TOKEN="TU_BOT_TOKEN_AQUI"CHAT_ID="TU_CHAT_ID_AQUI"MENSAJE="La Raspberry Pi se va a reiniciar en $(date)"curl -s -X POST https://api.telegram.org/bot$BOT_TOKEN/sendMessage \-d chat_id=$CHAT_ID \-d text="$MENSAJE"
Si has usado nano como editor, Guarda el archivo presionando Ctrl+O, Enter y luego Ctrl+X para salir. Si has usado otro editor, Guarda el archivo.
Vamos a hacer que el script sea ejecutable:
sudo chmod +x /usr/local/bin/alerta_telegram.sh
Probemos el script ejecutándolo:
/usr/local/bin/alerta_telegram.sh
Deberíamos recibir un mensaje en Telegram. Si ha funcionado, continuiamos.
Paso 4: Crear un servicio systemd para enviar la alerta antes del reinicio
Crea un archivo nuevo para el servicio:
sudo nano /etc/systemd/system/alerta_reinicio.service
Copia y pega esto:
[Unit]Description=Alerta antes de reinicioDefaultDependencies=noBefore=reboot.target shutdown.target[Service]Type=oneshotExecStart=/usr/local/bin/alerta_telegram.sh[Install]
WantedBy=reboot.target shutdown.targetGuarda y cierra el archivo.
Paso 5: Habilitar el servicio
Recarga systemd y habilita el servicio con:
sudo systemctl daemon-reload
sudo systemctl enable alerta_reinicio.serviceFuncionamiento
Ahora, justo antes de que la Raspberry Pi se reinicie o apague, ejecutará el script que envía el mensaje de alerta a Telegram.
Yo lo he probado y ha funcionado perfectamente.
Si por lo que sea, al probar el script para ver si funciona, te aparece un mensaje de error como este:
{"ok":false,"error_code":400,"description":"Bad Request: chat not found"}
indica que el bot de Telegram no puede encontrar el chat con el ID que le estás proporcionando. Esto puede deberse a varias causas comunes:
- Chat ID incorrecto: Asegúrate de que el chat ID que usas es correcto. Recuerda que debe ser el número exacto que te dio @userinfobot o el chat grupal donde hayas añadido el bot.
- El bot no está en el chat/grupo: Si usas un chat grupal, asegúrate de haber agregado el bot al grupo y de que tenga permisos para enviar mensajes.
- El chat es privado y el usuario no ha iniciado el bot: Debes iniciar una conversación con el bot (enviar un primer mensaje) para que el bot pueda enviar mensajes a ese chat.
Pasos para corregirlo:
- Verifica el chat ID con @userinfobot enviando un mensaje y copiando el ID exactamente.
- Asegúrate de enviar un mensaje inicial al bot en Telegram para "activar" la conversación.
- Si usas un grupo, añade el bot al grupo y usa el chat ID de ese grupo (que puedes obtener con métodos específicos como la API o bots que te informen el ID de grupo).
- Repite la prueba tras estas comprobaciones.
Espero que te sirva de ayuda.
- Detalles
- Escrito por: admin
- Visitas: 7