O script Python não inicia corretamente na reinicialização/inicialização do Raspberry Pi

O script Python não inicia corretamente na reinicialização/inicialização do Raspberry Pi

Para contextualizar, estou usando Raspberry Pi modelo 3B+. Atualmente estou tentando executar um script python na inicialização do Pi. Mas estou lutando para fazer com que o programa seja iniciado corretamente. Quando eu uso o arquivo de serviço a seguir, ele é iniciado, mas é reiniciado a cada 10 segundos, fazendo com que o programa seja iniciado infinitamente muitas vezes. Eu só quero que o programa seja iniciado uma 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

Mas se eu remover esta parte:

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

ou altere para Restart=on-failure, nada acontece quando o Raspberry Pi é inicializado.

O programa não precisa necessariamente ser executado no login automático do Desktop, portanto, se houver uma possível correção na versão do console, tudo bem também. Atualmente, só estou assim, então é mais fácil verificar se o programa está funcionando conforme o esperado.

Eu também tentei usar o crontab, mas nada aconteceu na reinicialização. Nem com nem sem o '&' no final.

Responder1

Aqui está o que acho que está acontecendo:

Sua máquina é inicializada, o servidor de exibição é iniciado e seu serviço é ativado. No entanto, piainda não está logado e por isso não consegue iniciar na primeira vez. Você Restart=alwayse Restart=10scertifique-se de que ele tente iniciar a cada 10 segundos, e isso acontece! Mas de alguma forma o seu processo principal está saindo e Restart=é acionado continuamente.

Aqui está uma ideia para resolver isso:

Mova o serviço para o barramento do usuário. Isso também significa que você não precisa definir DISPLAY, XAUTHORITYou , User=pois estão implícitos. Em seguida, altere a [Install]seção para WantedBy=graphical-session.target. Adicione PartOf=graphical-session.targetpara interromper o serviço quando o usuário sair da sessão. graphical-session.targeté um destino que está disponível apenas no barramento do usuário e só é gerado quando o usuário está logado em uma sessão gráfica. O Restart/ RestartSec/ KillMode/ TimeoutSecsó precisa ser definido se você realmente precisar dele para alguma coisa (não apenas para iniciar seu programa).

Isso garantirá que seu serviço não seja iniciado antes que o usuário esteja conectado à sessão gráfica (o que acho que foi o que o impediu de funcionar antes).

Para fazer isso, mova seu arquivo de serviço de /etc/systemd/system/para /home/pi/.config/systemd/user/bling.servicee deixe-o assim:

[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

Em seguida, habilite-o comsystemctl --user enable bling.service

informação relacionada