Por que o systemd está interrompendo o serviço imediatamente após ser iniciado?

1

Eu tenho um aplicativo baseado em C ++ que estou executando (executável) como um daemon com o systemd.

Arquivo de unidade:

[Unit]
Description=Console Service
After=network.target

[Service]
Environment="USER=ubuntu" "Path=/home/ubuntu/console/bin" 
WorkingDirectory=/home/ubuntu/console/bin
ExecStart=/bin/sh -ec "exec /sbin/start-stop-daemon -S -c ${USER} -d ${Path} --pidfile=/var/run/console.pid --oknodo  --exec consoleExecutable " #2>/dev/null
ExecStop=/bin/sh -ec "exec /sbin/start-stop-daemon -K --quiet -c ${USER} -d ${Path} --pidfile=/var/run/console.pid  --retry=TERM/30/KILL/5 --oknodo --exec consoleExecutable" #2>/dev/null
Restart=on-failure
RemainAfterExit=no
TimeoutStopSec=10
SuccessExitStatus=0 1
TimeoutStartSec=360

[Install]
WantedBy=multi-user.target

Quando eu emito o comando start, o serviço está iniciando, mas logo recebe um sinal de desligamento e depois sai. Alguma pista, o que está acontecendo?

sudo systemctl status console.service
● console.service - Console Service
   Loaded: loaded (/etc/systemd/system/console.service; enabled; vendor preset: enabled)
   Active: deactivating (stop-sigterm) since Mon 2017-09-25 19:58:58 UTC; 1s ago
  Process: 8706 ExecStop=/bin/sh -ec exec /sbin/start-stop-daemon -K --quiet -c ${USER} -d ${Path} --pidfile=/var/run/console.pid  --retry=TERM/30/KILL/5 --oknodo --exec consoleExecutable #2>/dev/null (code=exited, status=0/SUCCESS)
  Process: 8701 ExecStart=/bin/sh -ec exec /sbin/start-stop-daemon -S -c ${USER} -d ${Path} --pidfile=/var/run/console.pid --oknodo  --exec consoleExecutable  #2>/dev/null (code=exited, status=0/SUCCESS)
 Main PID: 8701 (code=exited, status=0/SUCCESS)
    Tasks: 1
   Memory: 1.8M
      CPU: 53ms
   CGroup: /system.slice/console.service
           └─8705 consoleExecutable

Sep 25 19:58:58 mgmt1 systemd[1]: Started Console Service.

sudo systemctl status console.service
● console.service - Console Service
   Loaded: loaded (/etc/systemd/system/console.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since Mon 2017-09-25 19:59:01 UTC; 947ms ago
  Process: 8706 ExecStop=/bin/sh -ec exec /sbin/start-stop-daemon -K --quiet -c ${USER} -d ${Path} --pidfile=/var/run/console.pid  --retry=TERM/30/KILL/5 --oknodo --exec consoleExecutable #2>/dev/null (code=exited, status=0/SUCCESS)
  Process: 8701 ExecStart=/bin/sh -ec exec /sbin/start-stop-daemon -S -c ${USER} -d ${Path} --pidfile=/var/run/console.pid --oknodo  --exec consoleExecutable  #2>/dev/null (code=exited, status=0/SUCCESS)
 Main PID: 8701 (code=exited, status=0/SUCCESS)

Sep 25 19:58:58 mgmt1 systemd[1]: Started Console Service.
    
por Nani 26.09.2017 / 01:23

2 respostas

2

Environment="USER=ubuntu" "Path=/home/ubuntu/console/bin" 
WorkingDirectory=/home/ubuntu/console/bin
ExecStart=/bin/sh -ec "exec /sbin/start-stop-daemon -S -c ${USER} -d ${Path} --pidfile=/var/run/console.pid --oknodo  --exec consoleExecutable " #2>/dev/null
ExecStop=/bin/sh -ec "exec /sbin/start-stop-daemon -K --quiet -c ${USER} -d ${Path} --pidfile=/var/run/console.pid  --retry=TERM/30/KILL/5 --oknodo --exec consoleExecutable" #2>/dev/null

Isso é quase digno da Casa do Horror. Se não houvesse uma história de terror lá que faz isso.

Não use start-stop-daemon em uma unidade de serviço para fazer todas as coisas que uma unidade de serviço já faz . Com arquivos PID desnecessários e a suposição equivocada de que ExecStart aceita comentários de sintaxe de shell, não menos que isso.

E não faça o que a outra resposta diz e tente contê-la com Type=forking . Isso piora as coisas, não melhor.

O absurdo com start-stop-daemon é porque as coisas estão indo mal. Como o processo que está executando start-stop-daemon não se torna o serviço, mas na verdade sai muito imediatamente, o systemd está pensando que seu serviço está encerrando. Na sua primeira systemctl status output, você pode ver que o systemd está no meio do envio de SIGTERM para limpar todos os processos que sobraram em execução após executar a ação ExecStop , que é o que faz quando pensa que um serviço terminou.

Basta fazer as coisas de maneira simples:

Type=simple
WorkingDirectory=/home/ubuntu/console/bin
User=ubuntu
ExecStart=/home/ubuntu/console/bin/consoleExecutable

Não é necessário ExecStop nem Environment .

Leitura adicional

por 26.09.2017 / 05:10
1

o systemd acha que o pid do seu daemon é o 8701 que é o pid de start-stop-daemon . O pid do seu daemon é 8705. Você precisa definir Type=forking (sob [Service] ) no seu arquivo unitário. O padrão é Type=simple , que supõe que o processo não é bifurcado.

No entanto, por que você está usando este /bin/sh -ec exec /sbin/start-stop-daemon monstrosity? O systemd pode lidar com tudo que o start-stop-daemon faz.

    
por 26.09.2017 / 01:52

Tags