Как настроить мониторинг процесса после его перезапуска?

Как настроить мониторинг процесса после его перезапуска?

У меня естьmonitнастроен на завершение пары процессов, когда они потребляют слишком много ресурсов ЦП, но как только любой из них завершается, 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), а затем использовать одно условие в конфигурации monit для каждой службы, чтобы запустить скрипт следующим образом:

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

При срабатывании этого execусловия по-прежнему будет отправляться оповещение по электронной почте, будет запущен скрипт для перезапуска процесса/службы, а затем monit продолжит следить за ним, поскольку ему не было сказано прекратить наблюдение.

Если вы выберете этот подход, вы также можете удалить эту stop programстроку из определений, так как она не будет использоваться, если вы не запустите monit stopслужбы.

Отредактируйте, чтобы прояснить ситуацию еще больше:

Monit ожидает, что ОС не занимается контролем процессов. Другими словами, она предполагает, что она единственная, кто отвечает за запуск или остановку процессов, и поэтому, когда вы говорите ей остановить что-то, она остановит этот процесс,ипрекратите его отслеживать, поскольку он предполагает, что никто не попытается запустить его снова (и поэтому иногда его неудобно использовать с launchd в macOS или systemd в Linux).

В вашем случае, вы хотите перезапустить процесс, если он использует слишком много вычислительной мощности, и сообщить вам, когда это произойдет. Есть два способа сделать это с помощью monit:

  1. Определите start programи stop programдля него, которые, если вы используете отдельный супервизор процессов в качестве вашей системы инициализации (что делает macOS), должны быть командами, которые сообщают ему о необходимости запустить или остановить программу, а затем сообщают monit о необходимости перезапустить процесс, если возникнет условие, а также добавляют условие для получения оповещения. В macOS вам нужна команда launchctlдля обработки перезапуска. Хотя это предпочтительный и «правильный» способ сделать это, launchctlс ним немного муторно работать (кажется, предполагается, что никто никогда не захочет вручную перезапускать службы), поэтому это не тот подход, который я бы рекомендовал.
  2. Напишите скрипт, который будет запускать перезапуск, а затем укажите путь к этому скрипту как execдействие для условия. execДействия неявно отправляют оповещения в текущих версиях monit, поэтому вам не нужно указывать какие-либо условия оповещения в этом случае. В вашем случае «скрипт» может быть просто следующим для первой службы:

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

    И затем что-то похожее для второго. Единственное, что ему нужно сделать, это каким-то образом запустить launchd, перезапуская службу, ему не нужно перезапускать ее саму. По сути, этот подход просто говорит monit запустить перезапуск, как вы пытаетесь сделать выше, он просто делает это немного более чистым способом, который дает желаемый результат.

Связанный контент