Como configuro para 'monitorar' um processo depois que ele é reiniciado?

1

Eu tenho monit configurado para finalizar um par de processos quando eles consomem muita CPU, mas, uma vez terminado, monit summary reporta "Não monitorado" para o processo, mesmo depois que o SO o relança.

Como configuro para 'monitorar' um processo depois que ele é 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, monit 5.25.2

    
por orome 31.05.2018 / 23:36

1 resposta

1

A questão é que você só está dizendo para parar o processo, que também pára de monitorá-lo.

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

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

A cláusula exec ainda enviará um alerta por e-mail quando for acionado, o script será executado para reiniciar o processo / serviço e, em seguida, o monitor continuará assistindo, já que não foi solicitado que ele pare de assisti-lo.

Supondo que você use essa abordagem, também é possível remover a linha stop program das definições, pois ela não será usada, a menos que você execute monit stop nos serviços.

Editar para esclarecer mais:

Monit espera que o sistema operacional não esteja lidando com a supervisão do processo. Em outras palavras, ele assume que é a única coisa responsável por iniciar ou parar processos e, portanto, quando você diz para parar alguma coisa, ambos irão interromper esse processo, e parem de monitorá-lo, porque não assume nada vai tentar iniciá-lo novamente (e, portanto, é um pouco difícil de usar às vezes com o launched do MacOS ou systemd no Linux).

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

  1. Defina um start program e stop program para ele, que, se estiver usando um supervisor de processo separado como seu sistema init (que o macOS) deve ser comandos que informam que iniciar ou parar o programa e, em seguida, informar a monit para reiniciar o processo se a condição ocorrer, além de adicionar uma condição para obter um alerta. No macOS, você precisa do comando launchctl para manipular a reinicialização. Embora esta seja a maneira preferida e "correta" de fazê-lo, launchctl é um pouco trabalhoso (parece assumir que ninguém nunca quer reiniciar manualmente os serviços), portanto não é a abordagem que eu recomendaria. / li>
  2. Escreva um script que acione a reinicialização e especifique o caminho para esse script como uma ação exec da condição. As ações exec implicitamente enviam alertas nas versões atuais do monit, portanto, não é necessário 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 precisa fazer é disparar o launchd reiniciando o serviço, não é necessário reiniciá-lo. Em essência, esta abordagem é apenas dizer ao monit para acionar o reinício, assim como você está tentando fazer acima, ele simplesmente faz isso de uma maneira um pouco mais clara que obtém o resultado que você deseja.

por 01.06.2018 / 21:48

Tags