프로세스가 다시 시작된 후 프로세스를 "감시"하도록 모니터링을 구성하려면 어떻게 해야 합니까?

프로세스가 다시 시작된 후 프로세스를 "감시"하도록 모니터링을 구성하려면 어떻게 해야 합니까?

나는 가지고있다monitCPU를 너무 많이 소비하는 경우 한 쌍의 프로세스를 종료하도록 구성되지만, 프로세스 중 하나가 종료되면 monit summary운영 체제가 프로세스를 다시 시작해도 해당 프로세스가 "모니터링되지 않음"으로 보고됩니다.

프로세스가 다시 시작된 후 프로세스를 "감시"하도록 모니터링을 구성하려면 어떻게 해야 합니까?


check process soagent
    matching "soagent"
    stop program = "/usr/bin/pkill -9 soagent"
    if cpu > 20% for 1 cycles then stop
    if cpu > 20% for 1 cycles then alert

check process callservicesd
    matching "callservicesd"
    stop program = "/usr/bin/pkill -9 callservicesd"
    if cpu > 20% for 1 cycles then stop
    if cpu > 20% for 1 cycles then alert 

macOS 10.13.4, 모니터링 5.25.2

답변1

문제는 프로세스를 중지하라고 지시하면 프로세스 모니터링도 중지된다는 것입니다.

이 경우 가장 간단한 해결책은 launchd에게 프로세스를 다시 시작하도록 지시하는 스크립트를 작성하는 것입니다(불행히도 저는 이에 대해 특별히 도움을 드릴 수 없습니다. 저는 macOS에 대해 잘 모릅니다). 그런 다음 각 A에 대해 monit에서 단일 조건을 사용합니다. 서비스 구성은 다음과 같이 스크립트를 실행합니다.

if cpu > 20% for 1 cycles then exec "/path/to/script"

exec절은 트리거될 때 여전히 이메일 경고를 보내고, 스크립트는 프로세스/서비스를 다시 시작하기 위해 실행되며, 모니터링을 중지하라는 지시가 없기 때문에 monit은 계속 모니터링합니다.

stop program이 접근 방식을 취한다고 가정하면 서비스에서 실행하지 않는 한 이 줄은 사용되지 않으므로 정의에서 해당 줄을 제거할 수도 있습니다 .monit stop

더 명확하게 설명하기 위해 편집합니다.

Monit은 운영 체제가 프로세스 감독을 처리하지 않을 것으로 예상합니다. 즉, 프로세스를 시작하거나 중지하는 역할을 담당하는 유일한 주체라고 가정하므로 사용자가 무언가를 중지하라고 지시할 때마다 해당 프로세스를 중지합니다.그리고아무것도 다시 시작하려고 시도하지 않을 것이라고 가정하기 때문에 모니터링을 중지합니다(따라서 Linux에서 macOS의 launchd 또는 systemd와 함께 사용하는 것이 약간 고통스러울 때도 있습니다).

귀하의 경우, 처리 능력을 너무 많이 사용하는 경우 프로세스를 다시 시작하고 이러한 일이 발생하면 알림을 받는 것이 좋습니다. 두 가지 방법으로 monit를 사용하여 이 작업을 수행할 수 있습니다.

  1. a start programstop program정의: 별도의 프로세스 관리자를 초기화 시스템으로 사용하는 경우(macOS처럼) 명령은 프로그램을 시작하거나 중지하라는 명령이어야 하며, 그런 다음 조건이 발생할 때 프로세스를 다시 시작하도록 monit에 지시해야 합니다. 알림을 받기 위한 조건입니다. macOS에서는 launchctl다시 시작을 처리하는 명령이 필요합니다. 이것이 선호되는 "올바른" 접근 방식이지만 launchctl사용하기가 약간 불편하므로(아무도 서비스를 수동으로 다시 시작하고 싶어하지 않을 것으로 가정하는 것 같습니다) 권장하고 싶지는 않습니다.
  2. exec다시 시작을 트리거하는 스크립트를 작성한 다음 조건부 작업 으로 스크립트 경로를 지정합니다 . execactions는 현재 버전의 monit에서 암시적으로 경고를 보내므로 이 경우 경고 조건을 지정할 필요가 없습니다. 귀하의 경우 첫 번째 서비스의 "스크립트"는 다음과 같을 수 있습니다.

    #!/bin/bash
    /usr/bin/pkill -9 soaagent
    

    그리고 두 번째 비슷한 것. 해야 할 유일한 일은 서비스를 다시 시작하기 위해 어떻게든 launchd를 트리거하는 것입니다. 자체적으로 다시 시작할 필요는 없습니다. 본질적으로 이 접근 방식은 위에서 수행하려는 것과 같이 다시 시작을 트리거하도록 monit에 지시할 뿐이며 원하는 결과를 얻기 위해 약간 더 깔끔한 방식으로 수행합니다.

관련 정보