systemd 타이머는 종료/다시 시작 시 ExecStop을 실행해야 합니다.

systemd 타이머는 종료/다시 시작 시 ExecStop을 실행해야 합니다.

시나리오는 프로덕션, 스테이징, 개발 및 베타 등 최대 4개의 JIRA 인스턴스를 실행할 수 있는 CentOS v7.0 시스템을 가지고 있다는 것입니다.

시스템을 시작할 때 4개의 서비스 인스턴스가 모두 100초 간격으로 시차를 두고 시작되기를 원합니다(각 JIRA 인스턴스는 시작하는 데 약 80초가 소요됨). 저는 systemd 타이머를 사용하여 시차 부팅 문제를 해결할 수 있었습니다(확실히 SysV 초기화에서 사용한 셸 코드보다 훨씬 더 우아합니다). 각 서비스는 자체 슬라이스에서 실행되며 슬라이스 제어를 통해 적절한 QOS 수준이 설정됩니다. 모든 것이 잘 작동합니다.

내가 겪고 있는 문제는 중지/종료/다시 시작을 실행할 때 jira_*.timer 인스턴스만 systemd 종료 스크립트에 의해 호출되고 JIRA 인스턴스가 제대로 종료되지 않는다는 것입니다.

종료/다시 시작 중에 jira_*.service 단위에서 ExecStop 작업을 트리거하는 방법은 무엇입니까?

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

jira_* .service 단위를 활성화하면 타이머가 무시되고 모든 것이 즉시 시작하려고 시도한다는 것을 알았기 때문에 jira_* .timer 단위만 활성화했습니다.

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

Journalctl에서 다시 시작하는 동안 실행된 타이머를 표시합니다.

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.

답변1

잘 작동하는 것으로 보이는 systemd 문서에 언급된 다소 해킹된 솔루션을 발견했습니다.

http://www.freedesktop.org/software/systemd/man/systemd-halt.service.html

실제 시스템 quit/poweroff/reboot/kexec를 실행하기 전에 systemd-shutdown은 /usr/lib/systemd/system-shutdown/에 있는 모든 실행 파일을 실행하고 "halt", "poweroff" , "reboot"라는 인수를 전달합니다. 또는 "kexec"(선택한 작업에 따라) 디렉터리의 모든 실행 파일은 병렬로 실행되며 모든 실행 파일이 완료될 때까지 실행이 계속되지 않습니다.

/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

관련 정보