
Eu tenhomonit
configurado para encerrar um par de processos quando eles consomem muita CPU, mas quando um deles é encerrado, monit summary
informa "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 exec
clá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 program
linha das definições, pois ela não será usada a menos que você execute monit stop
nos 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:
- Defina um
start program
estop program
para 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 dolaunchctl
comando 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. Escreva um script que acione a reinicialização e especifique o caminho para esse script como uma
exec
ação para a condição.exec
as 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.