Hacer que un controlador de seguidor sobreviva a los reinicios con systemd
Anatomía del fichero de unidad
Política de reinicio sin tormentas de reinicios
Dos servicios, un mismo patrón
Un fragmento de la implementación
Tal cual del ejemplo desplegado en el Raspberry PLC 21 — cópialo libremente:
[Unit]
Description=Solar tracker control (PyEphem + CANopen + TCP Node-RED)
# Starts once the network is up and the CAN bus is already configured
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
# Main tracker control script
ExecStart=/usr/bin/python3 /home/pi/tracker/main.py
WorkingDirectory=/home/pi/tracker
# Needs root for socketcan and GPIO
User=root
# Automatic restart if the process dies (CAN bus failure, exception, etc.)
Restart=always
RestartSec=10
# Logs to journald (check with journalctl -u solar-tracker.service)
StandardOutput=journal
StandardError=journal
# Avoid aggressive restart loops if something is truly broken
StartLimitIntervalSec=300
StartLimitBurst=10
[Install]
WantedBy=multi-user.targetEl ejemplo completo es un programa entero — cabecera de conexionado, setup y bucle principal — listo para adaptar a tu aplicación.
Preguntas frecuentes
¿Por qué ejecutar el servicio como root en lugar de con un usuario dedicado?
El proceso de control necesita acceso directo a la interfaz CAN y a los dispositivos de caracteres de GPIO. Puedes endurecerlo con permisos de grupo y reglas udev, pero en un PLC industrial de propósito único, root con una imagen endurecida es la línea base pragmática.
¿Cómo encaja Authelia delante de Node-RED?
Authelia actúa como portal de autenticación delante del dashboard, de modo que cada pestaña — control, calibración, inversor, configuración — requiere login. Node-RED permanece enlazado en local y nunca queda expuesto a la red sin autenticación.
¿Cómo compruebo por qué falló el servicio en campo?
systemctl status solar-tracker.service muestra el último estado y el código de salida, y journalctl -u solar-tracker.service --since today da el log completo. Como StandardOutput va a journald, no hay ficheros de log aparte que rotar.