systemd: 분기된 프로세스가 종료되면 서비스를 다시 시작합니다.

systemd: 분기된 프로세스가 종료되면 서비스를 다시 시작합니다.

생성된 프로세스가 종료되면 systemd 서비스를 자동으로 다시 시작하는 방법이 있습니까?

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

나는 그것이 3개의 다른 프로세스를 분기한 것을 발견했습니다.

# 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

을 죽이면 p_ctmagsystemd는 모든 것을 다시 시작하지만, 죽이면 p_ctmat그렇지 않습니다.

아니면 p_ctmatopens 이후 127.0.0.1:7035systemd가 이 포트를 모니터링하고 종료 시 서비스를 다시 시작할 수 있습니까?


PS1: 그렇죠아니요을 제어할 수 start-ag있으므로shut-ag제어 그룹의 프로세스 중 하나가 실패하면 Systemd는 서비스를 다시 시작합니다.여기서는 도움이 되지 않습니다.

PS2: 또한, 다른 스크립트 "레이어" 안에 스크립트를 포함하는 다른 스크립트 "레이어"를 추가할 수 없습니다. 순수한 시스템 단위 파일 솔루션이 필요합니다.

답변1

문제는 BMC가 Control-M/Agent에 대한 기본 시스템 서비스 파일을 구축하지 않았다는 것입니다. 이것9.0.18.200 버전 설치 안내)(로그인 필요) systemd-systems의 경우 이 템플릿과 함께 서비스 파일을 사용하도록 지시합니다.

[Unit]
Description=Control-M Agent

[Service]
Type=forking
RemainAfterExit=yes
ExecStart=[agent_home_dir]/ctm/scripts/rc.agent_user start
ExecStop=[agent_home_dir]/ctm/scripts/rc.agent_user stop

[Install]
WantedBy=multi-user.target

...Exec 줄은 단지 start-agand 주위의 래퍼 일 뿐이며 shut-ag, 이는 여러분이 사용하고 있는 것입니다. 문제는 forking실제로 "서비스"(시작 스크립트)가 여러 프로세스를 시작할 때 이것이 서비스 유형이라는 것을 systemd에 알리는 것으로 귀결됩니다 . systemd는 초기 스크립트 이후 첫 번째 하위 프로세스를 확인하면 서비스가 성공한 것으로 간주합니다(포킹). p_ctmag보시다시피 프로세스는 끝납니다. 출력은 systemctl status명확합니다.

Process: 6519 ExecStart=/opt/ctmagent/ctm/scripts/start-ag -u ctmagent -p ALL (code=exited, status=0/SUCCESS)

...여기서 pid 6519는 start-ag종료된 스크립트입니다. 다음은 표시되는 나머지 제어 그룹 프로세스입니다.

나는 또한 여기서 지적하고 싶다.시스템 문서설명하다:

이 설정을 사용하는 경우 systemd가 서비스의 기본 프로세스를 안정적으로 식별할 수 있도록 PIDFile= 옵션도 사용하는 것이 좋습니다.

...권장 BMC 서비스 파일이 포함되어 있지 않습니다.있지만$CONTROLM/pid/;세 프로세스 모두의 PID 파일을 다운로드합니다.진짜PID 파일은 다음과 같습니다.명명 된pid보다는 pid가 그 내용이기 때문입니다.

이것이 systemd가 p_ctmat프로세스를 다시 시작하지 않는 이유입니다.

프로세스를 별도로 제어되는 프로세스(이러한 스크립트에 의해 설정된 두 개의 환경 변수 포함)로 분할하기 위해 수천 줄의 공급업체 스크립트를 다시 작성하거나 BMC가 유용한 시스템 스크립트를 제공할 때까지 기다리지 않는 것이 좋습니다. .WATCHDOG_ENABLEDY​내 테스트에서는 이를 통해 프로세스를 p_ctmag모니터링 할 수 있었고 p_ctmat필요한 경우 다시 시작할 수 있었습니다. 프로세스 p_ctmatw는 이 프로세스의 하위 프로세스이며 p_ctmat필요 p_ctmatw에 따라 다시 시작됩니다.

여기에서 다음을 수행할 수 있습니다.

  • p_ctmagsystemd지금처럼 다시 시작됩니다
  • p_ctmatp_ctmag으로 WATCHDOG_ENABLED Y다시 시작 됩니다
  • p_ctmatwp_ctmat지금처럼 다시 시작됩니다

관련 정보