Existe alguma maneira de reiniciar automaticamente um serviço systemd se algum de seus processos bifurcados for morto?
Depois de criar um arquivo de unidade systemd para Control-M
[Unit]
After = network-online.target
After = remote-fs.target
Description = Control-M agent
Wants = network-online.target
[Service]
ExecStart = /opt/ctmagent/ctm/scripts/start-ag -u ctmagent -p ALL
ExecStop = /opt/ctmagent/ctm/scripts/shut-ag -u ctmagent -p ALL
Restart = always
RestartSec = 5
TimeoutSec = 5min
Type = forking
[Install]
WantedBy = multi-user.target
Percebi que ele bifurca 3 processos diferentes
# systemctl status ctmag.service
CGroup: /system.slice/ctmag.service
├─129041 /opt/ctmagent/ctm/exe/p_ctmag
├─129089 /opt/ctmagent/ctm/exe/p_ctmat
└─129091 /opt/ctmagent/ctm/exe/p_ctmatw -ATW_NAME ATW000
Se eu matar p_ctmag
, o systemd reinicia tudo, no entanto, se eu matar p_ctmat
, não
Ou, desde p_ctmat
opens 127.0.0.1:7035
, o systemd pode monitorar essa porta e reiniciar o serviço se fechado?
PS1: Eu não tenho controle sobre start-ag
e shut-ag
, então o serviço de reinicialização do Systemd se um dos processos no grupo de controle falhar não ajudará aqui.
PS2: Além disso, não consigo adicionar outra 'camada' de script, envolvendo o script em outra. Precisa de solução de arquivo de unidade systemd pura.
O problema que você está enfrentando é que o BMC ainda não construiu um arquivo de serviço systemd nativo para Control-M/Agent. O guia de instalação para a versão 9.0.18.200) (login necessário), para systemd-systems orienta você a usar um arquivo de serviço com este modelo:
... onde as linhas Exec são apenas wrappers ao redor
start-ag
eshut-ag
, que é o que você está usando. O problema se resume ao systemd ser informado de que este é umforking
tipo de serviço, quando na verdade o "serviço" (script de início) inicia vários processos. O systemd considera o serviço (bifurcação) bem-sucedido quando vê o primeiro processo filho após o script inicial. Esse processo acaba sendop_ctmag
, como você viu. Asystemctl status
saída deixa claro:... onde pid 6519 era o
start-ag
script, que já saiu. Isso é seguido pelos processos restantes do grupo de controle que você vê.Eu também destacaria aqui que os documentos do systemd dizem:
... que o arquivo de serviço BMC sugerido não inclui, apesar de haver arquivos PID para todos os três processos em
$CONTROLM/pid/
; embora eles não sejam arquivos PID reais , já que os arquivos são nomeados para o pid em vez do pid ser seu conteúdo.É por isso que o systemd não está reiniciando o
p_ctmat
processo.Além de reescrever um script de fornecedor de mais de mil linhas para dividir os processos em processos controlados individualmente (completos com os dois punhados de variáveis de ambiente que esses scripts definem) ou esperar que o BMC forneça um script systemd útil, minha sugestão seria alterar seu configuração do agente para definir o
WATCHDOG_ENABLED
parâmetro comoY
. Nos meus testes, isso permite que op_ctmag
processo observe op_ctmat
processo, que o reiniciará se necessário. Op_ctmatw
processo é filho dop_ctmat
processo, que será reiniciadop_ctmatw
conforme necessário.A partir daí, você está coberto:
p_ctmag
será reiniciado porsystemd
, como agorap_ctmat
será reiniciado porp_ctmag
(comWATCHDOG_ENABLED Y
)p_ctmatw
será reiniciado porp_ctmat
, como agora