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

monit: проверить процесс без pidfile

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

Я уже использую monit, но не знаю, как проверить процесс без файла pid. Правило будет примерно таким:

kill all processes named xxxx that have a running time greater than 2 minutes

Как бы вы выразили это в monit?

В monit вы можете использовать соответствующую строку для процессов, у которых нет PID. Используя пример процесса с именем "myprocessname",

check process myprocessname
        matching "myprocessname"
        start program = "/etc/init.d/myproccessname start"
        stop program = "/usr/bin/killall myprocessname"
        if cpu usage > 95% for 10 cycles then restart

Возможно, если вы проверите, находится ли загрузка процессора на определенном уровне в течение 10 циклов мониторинга (по 30 секунд каждый), а затем перезапустите или завершите работу, это может быть вариантом. Или вы могли бы использовать проверка метки времени monit в файле, относящемся к процессу.

Готового инструмента с такой функциональностью нет. Предположим, вы хотите убить скрипты php-cgi, которые работают дольше минуты. Сделай это:

pgrep php-cgi | xargs ps -o pid,time | perl -ne 'print "$1 " if /^\s*([0-9]+) ([0-9]+:[0-9]+:[0-9]+)/ && $2 gt "00:01:00"' | xargs kill

pgrep выберет процессы по имени, ps -o pid,time печатает время выполнения для каждого pid, а затем анализирует строку, извлекает из нее время и печатает pid, если время сравнивается с определенным. результат перешел на убийство.

Я решил именно эту проблему с помощью ps-watcher и написал об этом на linux.com несколько лет назад. ps-watcher позволяет вам отслеживать процессы и убивать их в зависимости от накопленного времени выполнения. Вот соответствующая конфигурация ps-watcher, если ваш процесс называется 'foo':

[foo]
  occurs = every
  trigger = elapsed2secs('$time') > 1*HOURS && $ppid != 1
  action = <<EOT
  echo "$command accumulated too much CPU time" | /bin/mail user\@host
  kill -TERM $pid
EOT

[foo?]
   occurs = none
   action = /usr/local/etc/foo restart

Ключ - линия

trigger = elapsed2secs('$time') > 1*HOURS && $ppid != 1`

в котором говорится: «Если накопленное время процесса> 1 часа, И я не родительский процесс, перезапустите меня.

Итак, я понимаю, что в этом ответе не используется monit, но он работает. пс-наблюдатель легок и прост в настройке, поэтому запускать его в дополнение к настройке монитора не составит труда.

Monit может делать это начиная с версии 5.4:

if uptime > 3 days then restart

Видеть: файл проекта CHANGES

Вы можете использовать это в monit как инструкцию exec.

    if [[ "$(uname)" = "Linux" ]];then killall --older-than 2m someprocessname;fi