systemd serviço usando 100% da minha CPU quando isso não acontece se eu iniciá-lo sem systemd

2

Estou usando o Debian Jessie com as últimas atualizações. Eu fiz um serviço systemd para executar um script quando meu servidor é iniciado. Aqui está sua configuração:

[Unit]
Description=(my description)

[Service]
ExecStart=/usr/bin/bot
Restart=restart-always

[Install]
WantedBy=multi-user.target

/usr/bin/bot é um script que executa um executável Mono. Consiste em:

#!/bin/bash
(cd /path/to/my/executable && mono bot.exe)

(Eu substitui o caminho aqui, mas o do meu script está correto.)

Quando executo o script /usr/bin/bot normalmente (simplesmente /usr/bin/bot no meu terminal), ele está funcionando como esperado. top informa que está usando entre 0 e, digamos, 20% da minha CPU, o que é normal. Mas quando eu começo com service bot start , top diz que está sempre usando pelo menos 100% da minha CPU.

Em ambos os casos bot está funcionando como esperado.

O que poderia explicar uma diferença tão grande no uso da CPU?

Obrigado.

    
por Pierre-Loup Pagniez 21.03.2015 / 15:22

3 respostas

3

Eu "consertei" colocando meu bot em screen , assim:

[Unit]
Description=(my description)

[Service]
RemainAfterExit=yes
ExecStart=/usr/bin/screen -dmS bot /usr/bin/bot
Restart=restart-always

[Install]
WantedBy=multi-user.target

Não sei por que colocar meu processo em uma tela corrige seu alto uso de CPU, mas, ei, funciona.

    
por 22.03.2015 / 02:04
0

O problema não está localizado no systemd.

O Systemd executa o processo sem stdin (= / dev / null). Todos os syscalls para read() são finalizados imediatamente (com stdin normal, read() é bloqueado até novos dados chegarem). Na prática geral, read() é chamado dentro do loop inacabado, o que gera um enorme uso da CPU. Para confirmar isso, tente anexar ao processo em execução com strace -p <pid> .

O processo precisa ser adaptado para ser executado sem stdin ou usar alguns wrappers como o comando screen proposto ou nohup

    
por 30.05.2017 / 09:15
0

Como na solução de @ niziak, a entrada está bloqueando. No meu caso resolvido por Adicionando StandardInput=tty ao [Serviço] corrigiu. Eu já estava redirecionando a saída para um console (não utilizado) em / dev / tty12.

Minha seção [serviço]:

[Service]
ExecStart=/usr/local/bin/vtclock -1  -c| -f /tmp/ntpstatus
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartPreventExitStatus=255
Type=simple
User=vtclock
StandardInput=tty
StandardOutput=tty
StandardError=null
TTYPath=/dev/tty12 

(OS = Ubuntu 16.04.3 LTS, minha primeira tentativa em um serviço systemd)

    
por 17.01.2018 / 23:04