El script de Python no se inicia correctamente al reiniciar/iniciar Raspberry Pi

El script de Python no se inicia correctamente al reiniciar/iniciar Raspberry Pi

Por contexto, estoy usando Raspberry Pi modelo 3B+. Actualmente estoy intentando ejecutar un script de Python en el arranque del Pi. Pero tengo dificultades para que el programa se inicie correctamente. Cuando uso el siguiente archivo de servicio, se inicia pero se reinicia cada 10 segundos, lo que hace que el programa se inicie infinitas veces. Sólo quiero que el programa se inicie una vez.

[Unit]
Description=Start Bling

[Service]
User=pi
Environment=DISPLAY=:0
WorkingDirectory=/home/pi/facial_recognition
Environment=XAUTHORITY=/home/pi/.Xauthority
Environment="prog_path"=/home/pi/facial_recognition
ExecStart=/usr/bin/python /home/pi/facial_recognition/run_on_start.py

Restart=always
RestartSec=10s
KillMode=process
TimeoutSec=infinity

[Install]
WantedBy=graphical.target

Pero si elimino esta parte:

Restart=always
RestartSec=10s
KillMode=process
TimeoutSec=infinity

o cámbielo a Reiniciar=en caso de falla, no sucede nada cuando se inicia la Raspberry Pi.

No es necesario que el programa se ejecute en el inicio de sesión automático de escritorio, por lo que si existe una posible solución en la versión de consola, también está bien. Actualmente lo tengo así, por lo que es más fácil comprobar si el programa funciona según lo previsto.

También intenté usar crontab, pero no pasó nada al reiniciar. Ni con ni sin el '&' al final.

Respuesta1

Esto es lo que creo que está sucediendo:

Su máquina se inicia, el servidor de visualización se inicia y su servicio se activa. Sin embargo, piaún no ha iniciado sesión y, por lo tanto, no se inicia la primera vez. Su Restart=alwaysy Restart=10sasegúrese de que intente iniciarse cada 10 segundos, ¡y lo hace! Pero de alguna manera su proceso principal está saliendo y Restart=se activa continuamente.

Aquí tienes una idea para solucionarlo:

Mover el servicio al bus de usuario. Esto también significa que no es necesario definir DISPLAY, XAUTHORITYo User=ya que están implícitos. Luego cambia la [Install]sección a WantedBy=graphical-session.target. Agregue PartOf=graphical-session.targetpara detener el servicio cuando el usuario cierre la sesión. graphical-session.targetes un objetivo que solo está disponible en el bus de usuario y solo se genera cuando el usuario inicia sesión en una sesión gráfica. El Restart/// sólo necesita definirse si realmente lo necesita para algo (no sólo para que se inicie el programa) RestartSec.KillModeTimeoutSec

Esto garantizará que su servicio no se inicie antes de que el usuario inicie sesión en la sesión gráfica (que creo que es lo que impedía que funcionara antes).

Para hacer eso, mueva su archivo de servicio de /etc/systemd/system/a /home/pi/.config/systemd/user/bling.servicey haga que se vea así:

[Unit]
Description=Bling
PartOf=graphical-session.target

[Service]
WorkingDirectory=/home/pi/facial_recognition
Environment="prog_path"=/home/pi/facial_recognition
ExecStart=/usr/bin/python /home/pi/facial_recognition/run_on_start.py

[Install]
WantedBy=graphical-session.target

Luego habilítelo consystemctl --user enable bling.service

información relacionada