사용자 정의 서비스로 리스너 서비스를 시작 및 중지하는 방법

사용자 정의 서비스로 리스너 서비스를 시작 및 중지하는 방법

제가 해결하려는 문제는 사용자 정의 서비스를 시작하거나 중지할 때 리스너 서비스를 시작하고 중지하는 것입니다. 구체적인 사례는 RHEL7의 IBM MQ V8이지만 Oracle DB 및 리스너 등에 대해서도 동일한 원칙이 적용되어야 합니다.

리스너 서비스는 메인 서비스 다음에 시작되어야 하고 메인 서비스 전에 중지되어야 합니다.

내 자신의 시스템 단위 파일을 답변으로 게시할 예정이지만 답변을 개선하기 위해 다른 응답을 찾고 있습니다.

답변1

주요 서비스/etc/systemd/system/[이메일 보호됨]로써 정의 된:

[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

청취 서비스/etc/systemd/system/[이메일 보호됨] 로써 정의 된:

[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

나는 사용하고있다템플릿 기능단일 단위 파일을 사용하여 여러 대기열 관리자를 관리할 수 있습니다. 큐 관리자 QM1을 시작하는 실제 명령은 다음과 같습니다.

$ sudo systemctl start qm@QM1

그러면 qm@QM1 및 qm-listener@QM1 서비스가 인스턴스화되고 시작됩니다.

이 콘텐츠를 제작하면서 배운 몇 가지 추가 참고 사항은 다음과 같습니다.

  • 유형이 분기되었습니다.[이메일 보호됨]실제 qmgr 프로세스를 포크한 후 strmqm 명령이 종료되기 때문입니다.[이메일 보호됨]runmqlsr 프로세스가 메인 프로세스이기 때문에 유형이 간단합니다.
  • systemd는 기본적으로 ExecStop 명령을 실행한 후 cgroup의 모든 프로세스에 SIGTERM을 보내기 때문에 KillMode 없음이 필요합니다. MQ는 SIGTERM을 수신할 때 오류를 발생시킵니다.
  • MQ가 PIDfile을 생성하지 않기 때문에 PIDfile이 지정되지 않았습니다. 지정된 경우 systemd는 시작이 실패한 것으로 간주합니다.
  • /etc/security/limits.conf 또는 /etc/security/limits.d/*conf에 정의된 제한은 pam 로그인 세션에만 적용되고 systemd에 의해 시작된 서비스는 pam 로그인 세션에서 실행되지 않기 때문에 LimitNOFILE 및 LimitNPROC가 추가되었습니다.
  • 리스너의 PartOf는 해당 qm 서비스가 중지될 때 중지되도록 보장합니다.

PartOf 옵션이 올바른 선택인지 잘 모르겠습니다.

관련 정보