systemd/ExecStop 스크립트를 강제로 실행하여 프로세스를 정리합니다.

systemd/ExecStop 스크립트를 강제로 실행하여 프로세스를 정리합니다.

systemd 219와 함께 RHEL7.X를 실행하면 다음 설정을 사용하여 "myService"라는 systemd 서비스가 있습니다.

ExecStart=/bin/bash /asp_APPL/myInstance/script/myServiceSystemdCtrl.sh start
ExecStop=/bin/bash /asp_APPL/myInstance/script/myServiceSystemdCtrl.sh stop
KillMode=none
Restart=no
Type=notify
NotifyAccess=all
###Can't use ExitType until Systemd 250 release ( systemctl --version )
#ExitType=cgroup

ExecStart 스크립트를 호출하면 여러 가지 상호 의존적인 프로세스가 실행되고 MAINPID=를 사용하여 NOTIFY 업데이트를 시작 스크립트에서 systemd로 보내고 단일 PID를 사용하여 가장 중요하다고 생각하는 프로세스인 systemctl 상태를 모니터링합니다. 다음과 같습니다:

[email protected] - "myService Instance : myInstance"
   Loaded: loaded (/etc/systemd/system/[email protected]; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2022-06-16 15:19:40 BST; 23h ago
  Process: 9700 ExecStop=/bin/bash /asp_APPL/myInstance/script/myServiceSystemdCtrl.sh stop (code=exited, status=0/SUCCESS)
 Main PID: 6099 (myMainProcess)

때때로 이 MAINPID가 실패하고 종료되지만 애플리케이션 자체는 자가 치유되고 일반적으로 복구되므로 /etc/systemd/system/myService.service 정의 파일에서 이를 사용합니다.

KillMode=none
Restart=no

이 "실패한" 상태 시나리오에서는 다음과 같은 systemctl 상태를 얻지만 이것이 주된 결과는 아닙니다. 위에서 언급한 자가 복구로 인해 이 잘못된 상태를 일시적으로 받아들일 수 있습니다.

[email protected] - "myService Instance : myInstance"
   Loaded: loaded (/etc/systemd/system/[email protected]; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Fri 2022-06-17 14:58:44 BST; 1s ago
  Process: 9700 ExecStop=/bin/bash /asp_APPL/myInstance/script/myServiceSystemdCtrl.sh stop (code=exited, status=0/SUCCESS)
  Process: 6099 ExecStart=/bin/bash /asp_APPL/myInstance/script/myServiceSystemdCtrl.sh start (code=exited, status=1/FAILURE)
 Main PID: 6099 (code=exited, status=1/FAILURE)

그러나 때때로 응용 프로그램을 복구할 수 없고 필요한 정리를 통해 모든 서비스를 "완전히" 종료하려고 합니다. ExecStop 스크립트는 이를 잘 수행합니다.

그러나 이것을 실행하면 아무것도 실행되지 않는 것 같습니다.

   systemctl stop myService@myInstance

그런데 실행하면 ExecStart의 시작 메시지가 바로 표시됩니다.

   systemctl restart myService@myInstance

그래서 나에게 있어 ExecStop 스크립트는 "실패한 상태"에 있을 때 절대 실행되지 않습니다.

다음 명령을 실행해 보았지만 ExecStop에서도 작동하지 않았습니다.

   systemctl reset-failed myService@myInstance
[email protected] - "myService Instance : myInstance"
   Loaded: loaded (/etc/systemd/system/[email protected]; enabled; vendor preset: disabled)
   Active: inactive (dead) since Fri 2022-06-17 15:30:16 BST; 8min ago
  Process: 9700 ExecStop=/bin/bash /asp_APPL/myInstance/script/myServiceSystemdCtrl.sh stop (code=exited, status=0/SUCCESS)
  Process: 27952 ExecStart=/bin/bash /asp_APPL/myInstance/script/myServiceSystemdCtrl.sh start (code=killed, signal=KILL)
 Main PID: 27952 (code=killed, signal=KILL)

어쨌든, ExecStop 스크립트가 systemctl 명령/컨텍스트에서만 실행되도록 강제할 수 있습니다. 정리를 위해 ExecStop 스크립트의 측면을 수동으로 실행할 수 있다는 점은 이해합니다. 하지만 스크립트의 모든 내부 시스템 의미를 고려하면 분리하기는 어렵습니다.

관련 정보