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:
- Defina um
start program
estop 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 comandolaunchctl
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> -
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çõesexec
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.