bash скрипт слежения за зависшими процессами

На одном из серверов был перенесен веб-сайт, из-за которого периодически подвисал дочерний httpd (apache2) процесс. Необходимо было временное решение на время отладки кода и решения проблемы на уровне сайта, которое отслеживало бы зависшие процессы.

Было решено написать bash скрипт, который отслеживает время жизни процесса, затраченное время процессора (CPU time) и нагрузку на процессов. В случае, если все 3 параметра достигают определенное пиковое конфигурируемое значение — процесс убивается. 

Использование

param1 — поисковая строка для вывода команды ps

param2 — опционально, вторая поисковая строка для уточнения результатов 

Код

Скрипт имеет ряд параметров:

  • cpuLimit=5000 — задает лимит потребления CPU умноженного на 100  (5000 — потребление 50% процессора)
  • timeLimit=600 — задает лимит времени работы процесса в секундах
  • cpuTimeLimit=400 — задает лимит потребления процессорного времени
  • killSignal — сигнал, который передается утилите kill. Я выставил HUP, что делает безопасное завершение процесса. Если процесс остается, то можно попробовать KILL, но это чревато проблемами 
  • verbose=1 — выводить информация о найденных процессах или нет
  • debug=1 — 1 — не убивать процесс (включив verbose — можно протестировать), 0 — убивать процесс 

Скрипт анализирует вывод команды ps с указанием специальных флагов. Далее идет двойная фильтрация вывода. Двойная фильтрация сделана из-за специфики сервера — стоит httpd (apache2) с модулем mpm-itk, который дает возможность запускать httpd сервер от имени отдельных пользователей, следовательно, необходимо было отслеживать процессы только одного сайта/пользователя. В итоге, команда 

Решение протестировано на ОС CentOS Linux release 7.2.1511 (Core)

Скачать bash скрипт