다시 시작 또는 종료 시퀀스 중에 monit을 사용할 때 문제를 발견했습니다. 먼저, monit의 구성 배경을 소개하겠습니다.
- 모니터링 버전은 5.5입니다.
- Monit은 inittab에서 null::respawn:/usr/bin/monit –Ic /etc/monitrc로 시작합니다.
- Monit은 30초마다 서비스를 확인하도록 구성되어 있습니다.
- Monit은 특정 사용자 정의 애플리케이션을 모니터링하고, 실행 중이 아닌 경우 해당 특정 사용자 정의 애플리케이션의 init 스크립트를 호출하여 다시 시작합니다.
- 응용 프로그램은 부팅 시 시작되는 /etc/init.d/ 폴더에 자체 초기화 스크립트를 가지고 있습니다. Monit은 inittab에서 이러한 init 스크립트가 실행된 후에 시작됩니다.
이제 문제를 해결하려면 다음을 수행하십시오.
시스템 종료/다시 시작 중에 모든 서비스 모니터링을 중지하기 위해 먼저 monit에 명령이 전송됩니다. 그런 다음 /etc/init.d/의 모든 종료 스크립트가 호출됩니다. 대부분의 경우 작동하지만 애플리케이션이 이미 정상적으로 닫혔을 때 monit이 애플리케이션을 시작하는 극단적인 경우가 있는데 이는 잘못된 것입니다. 아래 시퀀스 다이어그램에서 문제를 포착하려고합니다.
monit 소스 코드를 살펴보니 서비스 검사가 실패하면 monit이 언급된 명령을 분기하여 실행하려고 시도하는 것 같습니다. 따라서 monit이 unmonitor 명령을 수신하면 분기된 프로세스가 계속 진행될 수 있습니다. monit은 이 명령을 받았을 때 시작된 프로세스를 중지하지 않고 즉시 반환하는 것으로 보입니다.
monit에 의해 시작된 모든 하위 프로세스가 완료될 때까지 기다리는 방법이 있습니까?
이 문제를 피하기 위한 다른 제안 사항이 있습니까?