Назад | Перейти на главную страницу

использование monit, чтобы убить правильный процесс, зная, что это PID

Я пытаюсь использовать контролировать найти верные процессы, работающие слишком долго, и убить их.

На машине выполняются параллельные сборки, поэтому можно одновременно запускать несколько надежных процессов, но для этих процессов нет файла 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