
Tengomonit
configurado para finalizar un par de procesos cuando consumen demasiada CPU, pero una vez que cualquiera de ellos finaliza, monit summary
informa "No monitoreado" para el proceso, incluso después de que el sistema operativo lo reinicie.
¿Cómo configuro para 'monitorear' un proceso después de que se reinicia?
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
Respuesta1
El problema es que solo le estás diciendo que detenga el proceso, lo que también deja de monitorearlo.
En este caso, la solución más sencilla es escribir un script que le indique a launchd que reinicie el proceso (desafortunadamente no puedo ayudar con eso específicamente, no sé mucho sobre macOS) y luego usar un único condicional en el monitor. configuración para cada servicio para ejecutar el script de esta manera:
if cpu > 20% for 1 cycles then exec "/path/to/script"
La exec
cláusula seguirá enviando una alerta por correo electrónico cuando se active, el script se ejecutará para reiniciar el proceso/servicio y luego monit seguirá viéndolo ya que no se le ha indicado que deje de verlo.
Suponiendo que adopte este enfoque, también puede eliminar la stop program
línea de las definiciones, ya que no se utilizará a menos que ejecute monit stop
los servicios.
Edite para aclarar más las cosas:
Monit espera que el sistema operativo no esté manejando la supervisión del proceso. En otras palabras, asume que es el único responsable de iniciar o detener procesos y, por lo tanto, cuando le dices que detenga algo, detendrá ese proceso.ydeje de monitorearlo, porque asume que nada intentará iniciarlo nuevamente (y por lo tanto, a veces es un poco complicado usarlo con launchd o systemd de macOS en Linux).
En tu caso, lo que quieres es reiniciar el proceso si usa demasiada potencia de procesamiento y avisarte cuando esto suceda. Hay dos formas de hacer esto con monit:
- Defina un
start program
ystop program
para ello, que si usa un supervisor de procesos independiente como su sistema de inicio (lo que hace macOS) deberían ser comandos que le indiquen que inicie o detenga el programa, y luego indique a monit que reinicie el proceso si se produce la condición, también como agregar una condición para recibir una alerta. En macOS, necesita ellaunchctl
comando para gestionar el reinicio. Si bien esta es la forma preferida y "correcta" de hacerlo,launchctl
es un poco complicado trabajar con ella (parece asumir que nadie quiere reiniciar los servicios manualmente), por lo que no es el enfoque que recomendaría. Escriba un script que active el reinicio y luego especifique la ruta a ese script como una
exec
acción para la condición.exec
Las acciones envían alertas implícitamente en las versiones actuales de monit, por lo que no es necesario especificar ninguna condición de alerta en este caso. En su caso, el 'script' puede ser simplemente el siguiente para el primer servicio:#!/bin/bash /usr/bin/pkill -9 soaagent
Y luego algo similar para el segundo. Lo único que debe hacer es activar de alguna manera el lanzamiento y reiniciar el servicio, no es necesario reiniciarlo por sí mismo. En esencia, este enfoque simplemente le dice a monit que active el reinicio tal como lo intenta hacer anteriormente, simplemente lo hace de una manera un poco más limpia para obtener el resultado que desea.