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, pi
ainda não está logado e por isso não consegue iniciar na primeira vez. Você Restart=always
e Restart=10s
certifique-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
, XAUTHORITY
ou , User=
pois estão implícitos. Em seguida, altere a [Install]
seção para WantedBy=graphical-session.target
. Adicione PartOf=graphical-session.target
para 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
/ TimeoutSec
só 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.service
e 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