Использование monit для мониторинга totalmem для процессов delayed_job в приложении rails

Я настроил монитор, чтобы следить за процессами delayed_job, работающими, чтобы убедиться, что они не занимают слишком много памяти. Первоначально это было настроено для перезапуска, если процесс занимал 700 МБ, поэтому соответствующая часть файла monitrc выглядела следующим образом.

check process delayed_job_worker
  with pidfile /path/to/pidfile.pid
  start program = "/usr/bin/dj start" with timeout 60 seconds
  stop program = "/usr/bin/dj stop" with timeout 60 seconds
  if totalmem is greater than 700 MB then restart

Это работало, как и ожидалось, но delayed_job не был удален, поэтому после перезапуска работника другой пришел и забрал задание, delayed_job обрабатывает это, но задание будет выполнено несколько раз с использованием ресурсов, поэтому я хочу удалить отложенное работа в этом случае. Мое решение выглядит примерно так.

check process delayed_job_worker
  with pidfile /path/to/pidfile.pid
  start program = "/usr/bin/dj start" with timeout 60 seconds
  stop program = "/usr/bin/dj stop" with timeout 60 seconds
  if totalmem is greater than 700 MB then
exec "/path/to/script/kill_and_remove_dj /path/to/pidfile.pid"

Итак, теперь скрипт выполнен, этот скрипт получает pid из pidfile, убивает его и запускает скрипт ruby ​​через rails runner, чтобы найти delayed_job из pid и удаляет его из базы данных. Это все, кажется, работает как ожидалось, однако, что я замечаю, когда я делаю ps aux | grep kill_and_remove_dj после создания задания, которое я знаю, будет достигнуто ограничение памяти - команда выполняется снова и снова.

Насколько я понимаю, что totalmem в этом случае будет памятью процесса из pid и всех дочерних процессов. Когда exec запускает скрипт, он будет находиться в совершенно отдельном процессе. Просто ищите любые указатели или информацию от любого, кто имеет представление о том, что может быть причиной этой проблемы. Рад предоставить больше информации, если требуется.

0 ответов

Другие вопросы по тегам