Como configuro para 'monitorar' monitorar um processo após ele ser reiniciado?

Como configuro para 'monitorar' monitorar um processo após ele ser reiniciado?

Eu tenhomonitconfigurado para encerrar um par de processos quando eles consomem muita CPU, mas quando um deles é encerrado, monit summaryinforma "Não monitorado" para o processo, mesmo depois que o sistema operacional o reinicia.

Como configuro para 'monitorar' monitorar um processo após ele ser reiniciado?


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, monitor 5.25.2

Responder1

O problema é que você está apenas dizendo para interromper o processo, o que também para de monitorá-lo.

Nesse caso, a solução mais fácil é escrever um script que diga ao launchd para reiniciar o processo (infelizmente não posso ajudar com isso especificamente, não sei muito sobre macOS) e então usar uma única condicional no monit config para cada serviço para executar o script assim:

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

A execcláusula ainda enviará um alerta por e-mail quando for acionada, o script será executado para reiniciar o processo/serviço e então o monit continuará observando-o, pois não foi instruído a parar de observá-lo.

Supondo que você adote essa abordagem, você também pode remover a stop programlinha das definições, pois ela não será usada a menos que você execute monit stopnos serviços.

Edite para esclarecer melhor as coisas:

Monit espera que o sistema operacional não esteja lidando com a supervisão do processo. Em outras palavras, ele assume que é o único responsável por iniciar ou parar processos e, portanto, quando você diz para ele parar algo, ele interromperá o processo,epare de monitorá-lo, porque presume que nada tentará iniciá-lo novamente (e, portanto, às vezes é um pouco complicado usá-lo com o launchd ou systemd do macOS no Linux).

No seu caso, o que você deseja é reiniciar o processo caso ele utilize muito poder de processamento e avisar quando isso acontecer. Existem duas maneiras de fazer isso com o monit:

  1. Defina um start programe stop programpara ele, que se estiver usando um supervisor de processo separado como seu sistema de inicialização (o que o macOS faz), devem ser comandos que digam para iniciar ou parar o programa e, em seguida, diga ao monit para reiniciar o processo se a condição ocorrer, também como adicionar uma condição para receber um alerta. No macOS, você precisa do launchctlcomando para realizar a reinicialização. Embora esta seja a maneira preferida e 'correta' de fazer isso, launchctlé um pouco difícil de trabalhar (parece presumir que ninguém deseja reiniciar manualmente os serviços), portanto, não é a abordagem que eu recomendaria.
  2. Escreva um script que acione a reinicialização e especifique o caminho para esse script como uma execação para a condição. execas ações enviam alertas implicitamente nas versões atuais do monit, portanto, você não precisa especificar nenhuma condição de alerta nesse caso. No seu caso, o 'script' pode ser apenas o seguinte para o primeiro serviço:

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

    E então algo semelhante para o segundo. A única coisa que ele precisa fazer é de alguma forma acionar o launchd para reiniciar o serviço, ele não precisa reiniciá-lo sozinho. Em essência, essa abordagem consiste apenas em dizer ao monit para acionar a reinicialização, exatamente como você está tentando fazer acima, apenas de uma maneira um pouco mais limpa para obter o resultado desejado.

informação relacionada