Como iniciar e interromper um serviço de ouvinte junto com um serviço personalizado

1

O problema que estou tentando resolver é iniciar e interromper um serviço de ouvinte quando um serviço personalizado é iniciado ou interrompido. O caso específico é o IBM MQ V8 no RHEL7, mas o mesmo princípio deve se aplicar a, e. Oracle DB e ouvinte também.

O serviço de ouvinte deve começar depois e parar antes do serviço principal.

Vou postar meus próprios arquivos de unidade do sistema como resposta, mas estou procurando respostas adicionais para melhorar minha resposta.

    
por Bram 08.10.2015 / 11:01

1 resposta

1

O serviço principal /etc/systemd/system/[email protected] é definido como:

[Unit]
Description=IBM MQ V8 QM %i
Requires=qm-listener@%i.service
Before=qm-listener@%i.service

[Service]
Type=forking
User=mqm
Group=mqm
ExecStart=/opt/mqm/bin/strmqm %i
LimitNOFILE=10240
LimitNPROC=4096
ExecStop=/opt/mqm/bin/endmqm %i
KillMode=none

[Install]
WantedBy=multi-user.target

O serviço de ouvinte / etc / systemd / system / qm-listener @ .service é definido como:

[Unit]
Description=IBM MQ V8 %i Listener
PartOf=qm@%i.service

[Service]
Type=simple
User=mqm
Group=mqm
ExecStart=/opt/mqm/bin/runmqlsr -t TCP -m %i
LimitNOFILE=10240
LimitNPROC=4096
ExecStop=/opt/mqm/bin/endmqlsr -m %i
KillMode=none

[Install]
WantedBy=multi-user.target

Estou usando a função de modelo para que um único arquivo de unidade possa ser usado para gerenciar vários gerenciadores de filas. O comando real para iniciar o gerenciador de filas QM1 é

$ sudo systemctl start qm@QM1

Isso irá instanciar e iniciar um serviço qm @ QM1, assim como qm-listener @ QM1

Algumas notas adicionais que aprendi ao criar isso:

  • O tipo é forking para o qm @ .service porque o comando strmqm sai depois de bifurcar o processo qmgr real para o qm-listener @ .service o tipo é simples porque o processo runmqlsr é o processo principal
  • KillMode is none é necessário porque o systemd envia por padrão um SIGTERM para todos os processos no cgroup depois de executar o comando ExecStop. O MQ lança um erro quando recebe um SIGTERM.
  • nenhum arquivo PID é especificado porque o MQ não gera um e, se especificado, o systemd considera a inicialização como falha
  • LimitNOFILE e LimitNPROC adicionados porque os limites definidos em /etc/security/limits.conf ou /etc/security/limits.d/*conf são aplicados apenas às sessões de login pam e os serviços iniciados por systemd não são executados em um pam sessão de login.
  • PartOf no ouvinte garante que ele seja interrompido quando o serviço correspondente qm for interrompido

O que eu não tenho certeza é se a opção PartOf é a escolha certa.

    
por 08.10.2015 / 11:01

Tags