es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

No se puede ejecutar un servidor MQTT después de encender una Raspberry con crontab -e / @reboot.

He programado varios servidores mqtt en Python en una Raspberry Pi W (con Buster) para ejecutar un conjunto de comandos al recibir un mensaje mqtt dado del broker mqtt después de suscribirse a un conjunto de temas (encender/apagar gpios, leer y publicar temperaturas a través de mqtt, etc.).

Esta Raspberry se instalará en una ubicación remota y quiero ejecutar estos programas después del arranque para garantizar que estarán activos incluso si ocurre una pérdida temporal de suministro eléctrico y la Raspi se reinicia después del apagón.

He incluido una entrada @reboot en “sudo crontab -e” para lanzar un archivo bash que inicie los varios servidores después del arranque:

@reboot /usr/bin/sleep 60 && /home/pi/p/mqtt/mqtt201.sh

El sleep 60 es para dar tiempo a la Raspberry para completar el proceso de arranque antes de iniciar los programas.

El archivo bash para ejecutar es muy sencillo:

#!/bin/bash
/usr/bin/python3 /home/pi/p/mqtt/alive201.py >> /home/pi/p/mqtt/alive201.log 2>&1 &
/usr/bin/python3 /home/pi/p/mqtt/led201-05.py >> /home/pi/p/mqtt/led201-05.log 2>&1 &
/usr/bin/python3 /home/pi/p/mqtt/led201-27.py >> /home/pi/p/mqtt/led201-27.log 2>&1 &
/usr/bin/python3 /home/pi/p/mqtt/temp201b_mqtt.py >> /home/pi/p/mqtt/temp201b_mqtt.log 2>&1 &

Después de arrancar, cuando ssh a la Raspi, ninguno de los servidores se está ejecutando porque todos han salido después de un error señalado como sigue:

Traceback (most recent call last):
File “/home/pi/p/mqtt/alive201.py”, line 1, in
import paho.mqtt.client as mqtt
ModuleNotFoundError: No module named ‘paho’
Traceback (most recent call last):
File “/home/pi/p/mqtt/alive201.py”, line 1, in
import paho.mqtt.client as mqtt
ModuleNotFoundError: No module named ‘paho’

En otras palabras, por alguna razón, cuando se ejecutan los programas, el módulo paho-mqtt no se carga y no está disponible para que los programas lo ejecuten.

Si después del arranque ssh a la Raspberry y ejecuto manualmente el archivo bash, los servidores se inician y todo va bien.

¿Alguien sabe cómo puedo iniciar mis servidores a través de la opción de crontab @reboot con el script bash sin enfrentar el problema de la no disponibilidad del módulo paho-mqtt?

Gracias y saludos cordiales.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está relacionado con las variables de entorno que no se establecen correctamente cuando los programas se ejecutan a través de cron al inicio del arranque. Una solución podría ser especificar la ruta completa del ejecutable de Python y las bibliotecas/módulos requeridos dentro del script bash. Por ejemplo, el script bash podría modificarse de la siguiente manera:

    #!/bin/bash
    /usr/local/bin/python3 /home/pi/p/mqtt/alive201.py &>> /home/pi/p/mqtt/alive201.log 2>&1 &
    /usr/local/bin/python3 /home/pi/p/mqtt/led201-05.py &>> /home/pi/p/mqtt/led201-05.log 2>&1 &
    /usr/local/bin/python3 /home/pi/p/mqtt/led201-27.py &>> /home/pi/p/mqtt/led201-27.log 2>&1 &
    /usr/local/bin/python3 /home/pi/p/mqtt/temp201b_mqtt.py &>> /home/pi/p/mqtt/temp201b_mqtt.log 2>&1 &
    

    Aquí se especifica la ruta completa al ejecutable de Python (/usr/local/bin/python3) en lugar de solo python3. Además, la salida de los programas se redirige a archivos de registro (&>>) y cualquier mensaje de error se redirige al mismo archivo de registro (2>&1). Esto ayudará a depurar cualquier problema que pueda surgir.

    Otra opción podría ser cargar el archivo .bashrc en el script bash para asegurarse de que las variables de entorno estén establecidas correctamente. Por ejemplo, el script bash modificado podría ser:

    #!/bin/bash
    source /home/pi/.bashrc
    python3 /home/pi/p/mqtt/alive201.py &>> /home/pi/p/mqtt/alive201.log 2>&1 &
    python3 /home/pi/p/mqtt/led201-05.py &>> /home/pi/p/mqtt/led201-05.log 2>&1 &
    python3 /home/pi/p/mqtt/led201-27.py &>> /home/pi/p/mqtt/led201-27.log 2>&1 &
    python3 /home/pi/p/mqtt/temp201b_mqtt.py &>> /home/pi/p/mqtt/temp201b_mqtt.log 2>&1 &
    

    Aquí se carga el archivo .bashrc antes de iniciar los programas.

    Ambas soluciones deberían ayudar a garantizar que las bibliotecas/módulos requeridos estén disponibles cuando los programas se ejecuten a través de cron al inicio del arranque.

Comments are closed.