Como informar ao systemctl que o serviço já foi iniciado

0

Eu tenho um arquivo de unidade de serviço mediation.service como este:

[Unit]
Description=Mobile-IP Log dumper

[Service]
Type=forking
ExecStart=/opt/mediation/mediation start
ExecStopPost=/opt/mediation/mediation stop
ExecReload=/opt/mediation/mediation reload
PIDFile=/var/lib/mediation/syslog-ng.pid

Agora, suponha que alguém inicie o serviço diretamente com /opt/mediation/mediation start em vez de usar systemctl start mediation

Nesse caso, systemctl status mediation será exibido:

● mediation.service - Mobile-IP Log dumper
   Loaded: loaded (/etc/systemd/system/mediation.service; enabled; vendor preset: disabled)
   Active: inactive (dead) since Mon 2016-07-11 11:24:11 CEST; 8s ago
  Process: 14088 ExecStopPost=/opt/mediation/mediation stop (code=exited, status=0/SUCCESS)
  Process: 13482 ExecStart=/opt/mediation/mediation start (code=exited, status=0/SUCCESS)
 Main PID: 13746

É possível que systemctl status mediation mostre o status correto (ou seja, em execução) do serviço? Parece que o systemctl não recarrega o PIDFile quando verifica o status, porque nesse caso todas as informações estariam disponíveis e o status adequado é conhecido.

    
por Wernfried Domscheit 11.07.2016 / 11:31

2 respostas

2

Não, você não pode fazer isso.

O rastreamento de serviço do systemd é baseado principalmente em cgroups, então o processo não pode ser considerado parte de mediation.service a menos que esteja dentro do cgroup apropriado. (Por exemplo, é assim que os logins de usuários são separados do sshd.service: movendo-se para outro cgroup). Ele não se importa muito com os arquivos PID, mesmo que os use para verificação adicional.

Mas, mesmo que o processo seja movido manualmente para o cgroup correto (via / sys / fs / cgroup / systemd), todo o serviço ainda não será considerado 'ativo', a menos que tenha sido iniciado via systemd.

No Debian e em outras distribuições que ainda possuem uma mistura de /etc/init.d scripts, isso é resolvido editando o scriptlet common "LSB functions" para automagicamente executar novamente o initscript via systemctl se invocado manualmente.

Mas como para iniciar daemons diretamente … bem, não faça isso, eu acho? Ou crie um script de wrapper semelhante que também redirecione as startups manuais para systemctl.

    
por 11.07.2016 / 12:21
0

Como não há solução direta, uma solução alternativa pode ser algo para adicionar essas linhas ao script.

if [[ ! 'ps --no-headers -o args -p $PPID | grep systemd' ]] ; then 
   echo "You must start the application with 'systemctl start mediation'"
   exit 1
fi

Isso impede que o serviço seja iniciado fora do systemctl.

    
por 05.09.2018 / 08:08