Por que minha unidade Systemd está carregada, mas inativa (morta)?

22

Estou tentando configurar o Graphite no meu servidor. Eu posso iniciar o daemon do Carbon Cache sem problemas com sudo /opt/graphite/bin/carbon-cache.py start , mas estou com dificuldades para executá-lo como uma unidade Systemd.

Veja o que eu tenho no meu arquivo de serviço, graphite.service :

[Unit]
Description=Carbon for Graphite

[Service]
ExecStart=/opt/graphite/bin/carbon-cache.py start

[Install]
WantedBy=multi-user.target

Mas quando eu inicio a unidade, recebo o seguinte status:

$ systemctl status graphite.service            
* graphite.service - Carbon for Graphite
   Loaded: loaded (/etc/systemd/system/graphite.service; enabled)
   Active: inactive (dead) since Fri 2014-06-13 18:44:11 UTC; 2s ago
  Process: 4525 ExecStart=/opt/graphite/bin/carbon-cache.py start (code=exited, status=0/SUCCESS)
 Main PID: 4525 (code=exited, status=0/SUCCESS)

Jun 13 18:44:11 MEADOW systemd[1]: Started Carbon for Graphite.

Journalctl não fornece mais informações.

Como devo interpretar e depurar unidades com um status de "inativo (inoperante) ... (código = encerrado, status = 0 / SUCESSO)"? Já vi unidades com falha antes, mas este é carregado com sucesso e ainda não está em execução e não sei o que isso significa.

    
por Ryne Everett 13.06.2014 / 22:12

1 resposta

24

Por comentário de jasonwryan, enquanto o padrão Type=simple funciona para muitos arquivos de serviço do Systemd, ele não funciona quando o script em ExecStart inicia outro processo e é concluído, como é o caso do carbon-cache.py do grafite. Nesses casos, você precisa especificar explicitamente Type=forking na seção [Service] para que o Systemd saiba examinar o processo gerado em vez do inicial.

Como explicado em man systemd.service :

If set to forking, it is expected that the process configured with ExecStart= will call fork() as part of its start-up. The parent process is expected to exit when start-up is complete and all communication channels are set up. The child continues to run as the main daemon process. This is the behavior of traditional UNIX daemons. If this setting is used, it is recommended to also use the PIDFile= option, so that systemd can identify the main process of the daemon. systemd will proceed with starting follow-up units as soon as the parent process exits.

Resposta específica ao grafite

Embora o problema acima tenha resolvido o meu Systemd, rapidamente me deparei com problemas específicos de grafite (com o Twisted) e acabei retornando ao padrão Type .

Grafite < 0,9.12

Nas versões anteriores do Graphite, só é possível evitar o bifurcação usando a opção --debug :

[Service]
ExecStart=/opt/graphite/bin/carbon-cache.py --debug start

Grafite > = 0.9.13

Em esta solicitação pull , uma opção --no-daemon foi mesclada:

[Service]
ExecStart=/opt/graphite/bin/carbon-cache.py --no-daemon start
    
por 13.06.2014 / 23:58

Tags