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 fácil es escribir un script que le diga a launchd que reinicie el proceso (Lamentablemente, no puedo ayudar con eso específicamente, no sé mucho sobre macOS ), y luego use un solo condicional en la configuración de monit para cada servicio para ejecutar el script como este:
if cpu > 20% for 1 cycles then exec "/path/to/script"
La cláusula exec
aún enviará una alerta por correo electrónico cuando se active, el script se ejecutará para reiniciar el proceso/servicio y luego monit seguirá observándolo ya que no se le indicó que deje de verlo.
Suponiendo que adopte este enfoque, también puede eliminar la línea stop program
de las definiciones, ya que no se usará a menos que ejecute monit stop
en los servicios.
Monit espera que el sistema operativo no maneje 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, y dejará de monitorearlo, porque asume que nada lo hará. intente iniciarlo de nuevo (y, por lo tanto, es un poco molesto usarlo a veces con macOS's launchd o systemd en Linux ).
En su caso, lo que desea es reiniciar el proceso si usa demasiada potencia de procesamiento y avisarle cuando esto suceda. Hay dos formas de hacer esto con monit:
start program
y stop program
para él, que si usa un supervisor de proceso separado como su sistema de inicio (que hace macOS )deberían ser comandos que indiquen que inicie o detenga el programa, y luego decirle a monit que reinicie el proceso si ocurre la condición, así como agregar una condición para recibir una alerta. En macOS, necesita el comando launchctl
para manejar el reinicio. Si bien esta es la forma preferida y "correcta" de hacerlo,launchctl
es un poco complicado trabajar con (parece suponer que nadie quiere reiniciar manualmente los servicios ), 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 acción exec
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 inicio y reiniciar el servicio, no necesita reiniciarlo por sí mismo. En esencia, este enfoque solo le dice a monit que active el reinicio tal como lo intenta hacer arriba, solo lo hace de una manera un poco más limpia para obtener el resultado que desea.
$ join -t, file1 file2 | awk -F, '$3 == "v1" && $5 == "v2" { print $1 }'
a
$ join -t, file1 file2 | awk -F, '$3 == "v2" && $5 == "v1" { print $1 }'
b
Предполагается, что оба файла отсортированы. Если это не так, используйте
join -t, <( sort file1 ) <( sort file2 ) | awk...as above...
Команда join
выдаст
a,txt1,v1,txt5,v2
b,txt2,v2,txt6,v1
c,txt3,v1,txt7,v1
d,txt4,v2,txt8,v2
Это результат реляционного соединения двух файлов с использованием первого столбца в качестве ключа соединения. В нем перечислены строки, которые имеют одинаковый ключ соединения в обоих файлах, а также другие поля в каждом файле.
Код awk
смотрит на это и печатает первый столбец, только если в столбцах 3 и 5 есть значения, которые мы ищем.