
나는 가지고있다monit
너무 많은 CPU를 소비하는 경우 한 쌍의 프로세스를 종료하도록 구성되었지만, 일단 둘 중 하나가 종료되면 monit summary
OS가 프로세스를 다시 시작한 후에도 해당 프로세스에 대해 "모니터링되지 않음"을 보고합니다.
프로세스가 다시 시작된 후 프로세스를 '모니터링'하도록 구성하려면 어떻게 해야 합니까?
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에 대해서는 잘 모릅니다). 그런 다음 monit에서 단일 조건을 사용합니다. 다음과 같이 스크립트를 실행하려면 각 서비스에 대한 구성을 설정하세요.
if cpu > 20% for 1 cycles then exec "/path/to/script"
조항은 exec
트리거될 때 여전히 이메일 경고를 보내고, 프로세스/서비스를 다시 시작하기 위해 스크립트가 실행되고, 감시를 중지하라는 지시가 없기 때문에 monit는 이를 계속 감시합니다.
이 접근 방식을 취한다고 가정하면 서비스에서 stop program
실행하지 않으면 사용되지 않으므로 정의에서도 해당 줄을 제거할 수 있습니다.monit stop
더 명확하게 설명하기 위해 편집합니다.
Monit은 OS가 프로세스 감독을 처리하지 않을 것으로 예상합니다. 즉, 프로세스 시작 또는 중지를 담당하는 유일한 주체라고 가정하므로 사용자가 무언가를 중지하라고 하면 둘 다 해당 프로세스를 중지합니다.그리고모니터링을 중지하세요. 아무것도 다시 시작하려고 시도하지 않을 것이라고 가정하기 때문입니다(따라서 Linux에서 macOS의 launchd 또는 systemd와 함께 사용하는 것은 때때로 약간 고통스럽습니다).
귀하의 경우, 처리 능력을 너무 많이 사용하는 경우 프로세스를 다시 시작하고 이러한 일이 발생하면 알려주는 것이 좋습니다. monit를 사용하여 이를 수행할 수 있는 두 가지 방법이 있습니다.
- 별도의 프로세스 감독자를 초기화 시스템(macOS가 수행함)으로 사용하는 경우 프로그램을 시작하거나 중지하라는 명령이어야 하고 조건이 발생하면 프로세스를 다시 시작하도록 monit에게 지시해야 하는 a
start program
및 for를 정의합니다.stop program
경고를 받기 위한 조건을 추가하는 것입니다. macOS에서는launchctl
다시 시작을 처리하는 명령이 필요합니다. 이것이 선호되고 '올바른' 방법이지만 작업launchctl
하기가 약간 고통스럽기 때문에(아무도 수동으로 서비스를 다시 시작하고 싶어하지 않는다고 가정하는 것 같습니다), 따라서 제가 권장하는 접근 방식은 아닙니다. 다시 시작을 트리거하는 스크립트를 작성한 다음 해당 스크립트의 경로를
exec
조건에 대한 작업으로 지정합니다.exec
작업은 현재 버전의 monit에서 암시적으로 경고를 보내므로 이 경우 경고 조건을 지정할 필요가 없습니다. 귀하의 경우 '스크립트'는 첫 번째 서비스에 대해 다음과 같을 수 있습니다.#!/bin/bash /usr/bin/pkill -9 soaagent
그리고 두 번째에도 비슷한 것이 있습니다. 해야 할 유일한 일은 어떻게든 서비스를 다시 시작하도록 트리거하는 것입니다. 서비스 자체를 다시 시작할 필요는 없습니다. 본질적으로 이 접근 방식은 위에서 수행하려는 것처럼 monit에게 다시 시작을 트리거하도록 지시하는 것이며, 원하는 결과를 얻는 약간 더 깔끔한 방식으로 수행됩니다.