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


37

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

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

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

Як би ви це висловили монітом?


( ви повинні позначити тут відповідь )
ewwhite

Відповіді:


80

У 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 у файлі, пов'язаному з процесом.


1
Будьте обережні: це не спрацює. Існує більше одного процесу
ruX

1
Ви можете скористатись regexp: matchin "otherstuff. * myprocessname"
користувач174962

@ruX: що станеться, якщо збігаються кілька пов'язаних процесів? Як вони можуть впоратися?
kontextify

Це займає перший матч.
ewwhite

5

Немає готового до використання інструменту з такою функціональністю. Припустимо, ви хочете вбити скрипти 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, якщо час порівнюється з визначеним. результат перейшов вбити.


процес запуску протягом дуже тривалого часу набуває дивного часу виконання (62-13: 53: 05), тому час запуску повторного аналізу повинен бути ([-0-9] +: [0-9] +: [0-9] + ) - подивіться на мінус на початку виразу.
andrej

3

Я вирішив цю точну проблему з ps-watcher і написав про це на linux.com кілька років тому. ps-watcher дозволяє вам відстежувати процеси та вбивати їх на основі накопиченого часу запуску. Ось відповідна конфігурація PS-спостерігача, якщо ваш процес названий "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, але це працює. ps-watchcher легкий і простий у налаштуванні, тому немає ніякого шкоди, як запустити його на додаток до вашого монітору.



0

Ви можете перетворити це на monit як заяву exec.

    if [[ "$(uname)" = "Linux" ]];then killall --older-than 2m someprocessname;fi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.