o timer do systemd precisa executar o ExecStop no encerramento / reinicialização

3

O cenário é que eu tenho um sistema CentOS v7.0 que pode ter até quatro instâncias do JIRA em execução, as instâncias são Production, Staging, Development e BETA.

Quando eu inicio o sistema, eu quero que todas as quatro instâncias de serviço sejam iniciadas de maneira escalonada, com 100 segundos de intervalo (cada instância do JIRA leva cerca de 80 segundos para começar). Consegui resolver o início escalonado usando temporizadores systemd (que são certamente muito mais elegantes do que o código shell que eu estava usando no SysV). Cada serviço é executado em sua própria fatia e possui um nível adequado de QOS configurado por meio dos controles de fatia. Tudo corre muito bem.

O problema que estou tendo é que quando eu emito um shutdown / shutdown / reboot apenas as instâncias do jira _ *. timer estão sendo chamadas pelo script systemd shutdown e as instâncias do JIRA não estão sendo desligadas corretamente.

Como posso fazer com que a ação ExecStop nas unidades de serviço jira _ *. seja disparada durante um desligamento / reinicialização?

PRD = 5sec delay
STG = 100sec delay
DEV = 200sec delay
EAP = 300sec delay

/usr/lib/systemd/system/jira_stg.service

[Unit]
Description=Atlassian JIRA Staging instance
Documentation=https://confluence.atlassian.com/display/JIRA/JIRA+Documentation
After=mysql.service nginx.service
Requires=mysql.service nginx.service
Before=shutdown.target reboot.target halt.target
[Service] 
Type=forking
ExecStart=/jira/stg/catalina.home/bin/startup.sh
ExecStop=/jira/stg/catalina.home/bin/shutdown.sh 60
TimeoutSec=300
User=ujirastg
Group=gjirastg
Slice=jira_stg.slice
CPUAccounting=true
CPUShares=600
MemoryAccounting=true
MemoryLimit=1200M
BlockIOAccounting=true
BlockIOWeight=200
[Install]
WantedBy=multi-user.target

/usr/lib/systemd/system/jira_stg.timer

[Unit]
Description=Atlassian JIRA Staging instance service startup after delay
[Timer]
# Time to wait after systemd starts before we start the service
OnStartupSec=100s
AccuracySec=5s
Unit=jira_stg.service
[Install]
WantedBy=multi-user.target

Estou habilitando apenas as unidades jira_ * .timer, pois descobri que, se eu ativasse as unidades jira_ * .service, os timers eram ignorados e tudo tentava iniciar de uma vez.

systemctl enable jira_eap.timer
systemctl enable jira_dev.timer
systemctl enable jira_stg.timer
systemctl enable jira_prd.timer

Do journalctl, mostrando os timers sendo acionados durante uma reinicialização.

jira systemd[1]: Stopping Flexible branding.
jira systemd[1]: Stopped Flexible branding.
jira systemd[1]: Stopping Timers.
jira systemd[1]: Stopped target Timers.
jira systemd[1]: Stopping Atlassian JIRA Early Access Program instance service startup after delay.
jira systemd[1]: Stopped Atlassian JIRA Early Access Program instance service startup after delay.
jira systemd[1]: Stopping Atlassian JIRA Development instance service startup after delay.
jira systemd[1]: Stopped Atlassian JIRA Development instance service startup after delay.
jira systemd[1]: Stopping Atlassian JIRA Staging instance service startup after delay.
jira systemd[1]: Stopped Atlassian JIRA Staging instance service startup after delay.
jira systemd[1]: Stopping Daily Cleanup of Temporary Directories.
jira systemd[1]: Stopped Daily Cleanup of Temporary Directories.
jira systemd[1]: Stopping Atlassian JIRA Production instance service startup after delay.
jira systemd[1]: Stopped Atlassian JIRA Production instance service startup after delay.
jira systemd[1]: Stopping Sockets.
jira systemd[1]: Stopped target Sockets.
    
por Ausmith1 06.08.2014 / 18:04

1 resposta

2

Eu encontrei uma solução um pouco hackeada referida nos documentos do systemd que parece funcionar bem.

link

Immediately before executing the actual system halt/poweroff/reboot/kexec systemd-shutdown will run all executables in /usr/lib/systemd/system-shutdown/ and pass one arguments to them: either "halt", "poweroff", "reboot" or "kexec", depending on the chosen action. All executables in this directory are executed in parallel, and execution of the action is not continued before all executables finished.

/usr/lib/systemd/system-shutdown/jira_shutdown.sh

#!/bin/sh
case "$1" in
  halt|poweroff|reboot|kexec)
  # Shutdown any running JIRA instances
  for ENVIRONMENT in eap dev stg prd
  do
    STATUS=$(/usr/bin/systemctl is-active jira_${ENVIRONMENT}.service)
    if [ ${STATUS} == "active" ]; then
      /usr/bin/systemctl stop jira_${ENVIRONMENT}.service
    fi
  done
  ;;
  *)
  ;;
esac
    
por 07.08.2014 / 15:59

Tags