생성된 프로세스가 종료되면 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_ctmag
systemd는 모든 것을 다시 시작하지만, 죽이면 p_ctmat
그렇지 않습니다.
아니면 p_ctmat
opens 이후 127.0.0.1:7035
systemd가 이 포트를 모니터링하고 종료 시 서비스를 다시 시작할 수 있습니까?
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-ag
and 주위의 래퍼 일 뿐이며 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_ENABLED
Y
내 테스트에서는 이를 통해 프로세스를 p_ctmag
모니터링 할 수 있었고 p_ctmat
필요한 경우 다시 시작할 수 있었습니다. 프로세스 p_ctmatw
는 이 프로세스의 하위 프로세스이며 p_ctmat
필요 p_ctmatw
에 따라 다시 시작됩니다.
여기에서 다음을 수행할 수 있습니다.
p_ctmag
systemd
지금처럼 다시 시작됩니다p_ctmat
p_ctmag
으로WATCHDOG_ENABLED Y
다시 시작 됩니다p_ctmatw
p_ctmat
지금처럼 다시 시작됩니다