Я пытаюсь использовать контролировать найти верные процессы, работающие слишком долго, и убить их.
На машине выполняются параллельные сборки, поэтому можно одновременно запускать несколько надежных процессов, но для этих процессов нет файла PID.
Моя конфигурация монитора выглядит так:
check process surefire matching "surefire/surefirebooter"
if uptime > 4 hours then alert
if uptime > 4 hours then stop
Оповещение отправлено, но остановка не работает.
Я не могу использовать убить всех поскольку процесс запускается java, и есть несколько других запущенных java-процессов.
Все, что мне нужно, это определить правильный PID этого процесса, чтобы я мог убийство правый.
Там есть MONIT_PROCESS_PID переменная окружения передается в контекст программы, выполняемой командой exec.
if uptime > 4 hours then stop
следует заменить на
if uptime > 4 hours then exec "/usr/bin/monit-kill-process.sh"
и /usr/bin/monit-kill-process.sh должен выглядеть как
#!/bin/bash
# script run from monit instance
# this will find long-running surefire process and kill it
kill -9 $MONIT_PROCESS_PID
Единственная проблема заключается в том, что monit в любом случае не подходит для этой работы, так как он хочет, чтобы процесс соответствовал чек шаблон, который нужно найти каждый раз, когда он выполняет проверку, в противном случае он пытается запустить процесс, используя Начало часть определения проверки (это не совсем то, что мы хотим делать).
Так что я нашел и модифицировал этот oneliner ps / grep / perl / xargs, который я запускаю через cron. Он может находить процессы по подстроке командной строки, выбирать долго выполняющиеся и хорошо с ними обращаться.
#!/bin/bash
# script run from monit instance
# this will find long-running surefire process and kill it
readonly PROCESS_STRING="surefireboot"
/bin/ps -e -o pid,time,command \
| /bin/grep $PROCESS_STRING \
| /usr/bin/perl -ne 'print "$1 " if /^\s*([0-9]+) ([-0-9]+:[0-9]+:[0-9]+)/ && $2 gt "04:00:00"' \
| /usr/bin/xargs kill
Monit может не подходить для этого. При сопоставлении с образцом используется только первое совпадение.
Это можно проверить с помощью monit procmatch <pattern>
Я бы предложил пометить ваши сборки уникальным идентификатором и использовать его в последовательности сопоставления с образцом ... Или полностью управлять демоном с помощью monit.
Вам также не нужно использовать killall. Может быть, какая-то логика вокруг pkill или pgrep.
Также см: monit: проверить процесс без pidfile