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.