systemd service será iniciado manualmente, mas não no boot?

4

Eu escrevi um serviço systemd para iniciar o groundcontrol no meu Raspberry Pi.

[Unit]
Description=Groundcontrol status monitor

[Service]
ExecStart=/opt/groundcontrol/groundcontrol/start.sh
Type=forking

[Install]
WantedBy=multi-user.target  

Estou usando o script porque o groundcontrol não funcionará corretamente, a menos que seja iniciado a partir do diretório bin. Aqui está o script:

cd /opt/groundcontrol/groundcontrol
./groundcontrol &

Isso funciona perfeitamente quando eu inicio manualmente, mas quando eu inicio meu Pi e executo systemctl ele diz que ele falhou. systemctl status groundcontrol.service imprime

groundcontrol.service - Groundcontrol status monitor
   Loaded: loaded (/etc/systemd/system/groundcontrol.service; enabled)
   Active: failed (Result: exit-code) since Wed 1969-12-31 17:00:14 MST; 43 years 11 months ago
  Process: 111 ExecStart=/opt/groundcontrol/groundcontrol/start.sh (code=exited, status=0/SUCCESS)
 Main PID: 116 (code=exited, status=2)

Dec 31 17:00:11 waldo systemd[1]: Starting Groundcontrol status monitor...
Dec 31 17:00:12 waldo systemd[1]: Started Groundcontrol status monitor.
Dec 31 17:00:14 waldo systemd[1]: groundcontrol.service: main process exited, code=exited, status=2/INVALIDARGUMENT
Dec 31 17:00:14 waldo systemd[1]: Unit groundcontrol.service entered failed state. 

Quando eu o executo manualmente, o status é

groundcontrol.service - Groundcontrol status monitor
   Loaded: loaded (/etc/systemd/system/groundcontrol.service; enabled)
   Active: active (running) since Thu 2013-12-26 15:38:02 MST; 1s ago
  Process: 296 ExecStart=/opt/groundcontrol/groundcontrol/start.sh (code=exited, status=0/SUCCESS)
 Main PID: 297 (groundcontrol)
   CGroup: /system.slice/groundcontrol.service
           '-297 ./groundcontrol

Dec 26 15:38:02 waldo systemd[1]: Started Groundcontrol status monitor. 

Havia um script de init do System V fornecido com o groundcontrol, mas eu não sabia como usá-lo com o systemd - isso é possível e funcionará melhor do que o meu serviço? Se não, como posso consertar este serviço? Obrigado.

    
por Lily Hahn 26.12.2013 / 23:39

1 resposta

4

Os registros dizem:

main process exited, code=exited, status=2/INVALIDARGUMENT

Isso significa que o problema é com groundcontrol ; ele retornou o status 2 (algum tipo de falha).

Normalmente, este problema específico - falha do serviço apenas na inicialização - é causado pelo serviço ser iniciado muito cedo , isto é, quando é necessário algum dispositivo de hardware que ainda não tenha sido descoberto pelo sistema. (Lembre-se que em sistemas Linux modernos, praticamente todos os dispositivos são descobertos dinamicamente; não existe nenhum ponto onde diz "oh, eu tenho todos os dispositivos, vamos iniciar o init.")

A solução seria reescrever o programa para usar o libudev e adicionar dispositivos dinamicamente.

A solução é solicitar o serviço após o dispositivo específico (não sei qual dispositivo ele precisa, por isso não posso dar uma resposta completa) ou usar Wants = + After = para atrair systemd-udev-settle.service , que aguarda até o udev processar o primeiro lote de eventos "novo dispositivo".

Além disso, por que você tem um script .sh totalmente separado com o único propósito de copiar para um diretório? WorkingDirectory= + Type=simple seria suficiente. (O & também é desnecessário, já que o próprio systemd - sendo um gerenciador de serviços - executa tudo em "segundo plano").

    
por 27.12.2013 / 09:45