Как отслеживать delayed_job с помощью monit - PullRequest
74 голосов
/ 04 августа 2009

Есть ли в Интернете примеры того, как отслеживать delayed_job с помощью Monit ?

Все, что я могу найти, использует Бога , но я отказываюсь использовать Бога, так как долго работающие процессы в Ruby обычно отстойны. (Самый последний пост в списке рассылки Бога? Использование памяти Бога неуклонно растет .)

Обновление: delayed_job теперь поставляется с примером конфигурации monit на основе этого вопроса.

Ответы [ 13 ]

97 голосов
/ 17 августа 2009

Вот как у меня это получилось.

  1. Используйте colleideidea fork of delayed_job . Помимо активной поддержки, эта версия имеет замечательного демона script/delayed_job, который вы можете использовать с monit. У Railscasts есть хороший эпизод об этой версии delayed_job ( ASCIICasts version ). Этот скрипт также имеет некоторые другие приятные функции, такие как возможность запуска нескольких рабочих. Я не рассматриваю это здесь.
  2. Установить монитор. Я установил из источника, потому что версия Ubuntu так смешно устарела. Я следовал этим инструкциям , чтобы получить стандартные скрипты init.d, которые поставляются с пакетами Ubuntu. Мне также нужно было настроить ./configure --sysconfdir=/etc/monit, чтобы был выбран стандартный каталог конфигурации Ubuntu.
  3. Написать скрипт monit. Вот что я придумал:

    check process delayed_job with pidfile /var/www/app/shared/pids/delayed_job.pid
    start program = "/var/www/app/current/script/delayed_job -e production start"
    stop program = "/var/www/app/current/script/delayed_job -e production stop" 1025 *
    *

    Я сохраняю это в моей системе управления soucre и указываю на него с помощью include /var/www/app/current/config/monit в файле /etc/monit/monitrc.

  4. Настроить мониторинг. Эти инструкции перегружены рекламой, но в остальном ОК.
  5. Напишите задачу для остановки и запуска capistrano. monit start delayed_job и monit stop delayed_job - это то, что вы хотите запустить. Я также перезагружаю monit при развертывании, чтобы получить любые изменения в файле конфигурации.

Проблемы, с которыми я столкнулся:

  1. daemons gem должен быть установлен для script/delayed_job для запуска.
  2. Вы должны передать среду Rails в script/delayed_job с -e production (например). Это задокументировано в файле README, но не в выводе справки скрипта.
  3. Я использую Ruby Enterprise Edition, поэтому мне нужно было настроить monit для запуска этой копии Ruby. Из-за того, что sudo обрабатывает PATH в Ubuntu, я закончил символическими ссылками /usr/bin/ruby и /usr/bin/gem на версии REE.

При отладке monit я обнаружил, что это помогает остановить версию init.d и запустить ее из командной строки th, чтобы вы могли получать сообщения об ошибках. В противном случае очень трудно понять, почему что-то идет не так.

sudo /etc/init.d/monit stop
sudo monit start delayed_job

Надеюсь, это поможет следующему человеку, который хочет отслеживать delayed_job с помощью monit.

8 голосов
/ 12 ноября 2009

Для чего бы то ни было, вы всегда можете использовать / usr / bin / env с monit для настройки среды. Это особенно важно в текущей версии delayed_job 1.8.4, где опция среды (-e) устарела.

check process delayed_job with pidfile /var/app/shared/pids/delayed_job.pid
start program = "/usr/bin/env RAILS_ENV=production /var/app/current/script/delayed_job start"
stop  program = "/usr/bin/env RAILS_ENV=production /var/app/current/script/delayed_job stop"

В некоторых случаях вам также может понадобиться установить PATH с помощью env.

5 голосов
/ 30 июня 2010

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

Мой график.rb:

# custom job type to control delayed_job
job_type :delayed_job, 'cd :path;RAILS_ENV=:environment script/delayed_job ":task"'

# delayed job start on boot
every :reboot do
  delayed_job "start"
end

Примечание: я обновлял gem до версии 0.5.0, чтобы можно было использовать job_type

5 голосов
/ 21 мая 2010

Я обнаружил, что было проще создать сценарий инициализации для отложенной работы. Это доступно здесь: http://gist.github.com/408929 или ниже:

#! /bin/sh
set_path="cd /home/rails/evatool_staging/current"

case "$1" in
  start)
        echo -n "Starting delayed_job: "
                su - rails -c "$set_path; RAILS_ENV=staging script/delayed_job start" >> /var/log/delayed_job.log 2>&1
        echo "done."
        ;;
  stop)
        echo -n "Stopping sphinx: "
                su - rails -c "$set_path; RAILS_ENV=staging script/delayed_job stop" >> /var/log/delayed_job.log 2>&1
        echo "done."
        ;;
      *)
            N=/etc/init.d/delayed_job_staging
            echo "Usage: $N {start|stop}" >&2
            exit 1
            ;;
    esac

    exit 0

Затем убедитесь, что monit настроен на запуск / перезапуск приложения в вашем файле monitrc:

check process delayed_job with pidfile "/path_to_my_rails_app/shared/pids/delayed_job.pid"
start program = "/etc/init.d/delayed_job start"
stop program = "/etc/init.d/delayed_job stop"

и это прекрасно работает!

2 голосов
/ 09 марта 2016

Если ваш монитор работает как root и вы хотите запустить delayed_job как my_user , то сделайте следующее:

/ и т.д. / init.d / delayed_job

#!/bin/sh
#   chmod 755 /etc/init.d/delayed_job
#   chown root:root /etc/init.d/delayed_job

case "$1" in
  start|stop|restart)
    DJ_CMD=$1
    ;;
  *)
    echo "Usage: $0 {start|stop|restart}"
    exit
esac

su -c "cd /var/www/my_app/current && /usr/bin/env bin/delayed_job $DJ_CMD" - my_user

/ вар / WWW / my_app / Shared / монит / delayed_job.monitrc

check process delayed_job with pidfile /var/www/my_app/shared/tmp/pids/delayed_job.pid
start program = "/etc/init.d/delayed_job start"
stop  program = "/etc/init.d/delayed_job stop"
if 5 restarts within 5 cycles then timeout

/ и т.д. / монит / monitrc

# add at bottom
include /var/www/my_app/shared/monit/*
2 голосов
/ 28 января 2010

Мне пришлось объединить решения на этой странице с другим скриптом , созданным toby, чтобы он работал с monit и начинался с подходящего пользователя.

Итак, мой delayed_job.monitrc выглядит так:

check process delayed_job
  with pidfile /var/app/shared/pids/delayed_job.pid
  start program = "/bin/su -c '/usr/bin/env RAILS_ENV=production /var/app/current/script/delayed_job start' - rails"
  stop program = "/bin/su -c '/usr/bin/env RAILS_ENV=production /var/app/current/script/delayed_job stop' - rails"
2 голосов
/ 05 декабря 2009

Спасибо за скрипт.

Одна ошибка - поскольку у монитора по определению есть «спартанский путь» из

/bin:/usr/bin:/sbin:/usr/sbin

... и для меня ruby ​​был установлен / подключен в / usr / local / bin, мне приходилось часами разбираться, пытаясь выяснить, почему monit молча терпел неудачу при попытке перезапустить delayed_job (даже с -v для monit подробный режим).

В конце концов мне пришлось сделать это:

check process delayed_job with pidfile /var/www/app/shared/pids/delayed_job.pid
start program = "/usr/bin/env PATH=$PATH:/usr/local/bin /var/www/app/current/script/delayed_job -e production start"
stop program = "/usr/bin/env PATH=$PATH:/usr/local/bin /var/www/app/current/script/delayed_job -e production stop"
2 голосов
/ 04 августа 2009

С Monit я не знаю, но я написал пару плагинов Munin для мониторинга размера очереди и среднего времени выполнения задания. Изменения, которые я внес в delayed_job в этом патче, могут также облегчить вам написание плагинов Monit на случай, если вы будете придерживаться этого.

1 голос
/ 16 августа 2011

Для Rails 3 вам может понадобиться установить HOME env для правильной работы компаса, и ниже приведенный конфиг работает для меня:

check process delayed_job
  with pidfile /home/user/app/shared/pids/delayed_job.pid
  start program = "/bin/sh -c 'cd /home/user/app/current; HOME=/home/user RAILS_ENV=production script/delayed_job start'"
  stop program  = "/bin/sh -c 'cd /home/user/app/current; HOME=/home/user RAILS_ENV=production script/delayed_job stop'"
1 голос
/ 27 мая 2010

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

Вот статья, которую я написал об этом: http://modernagility.com/articles/5-monitoring-delayed_job-and-its-jobs

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

...