Как контролировать delayed_job с monit

float i = Float.NaN;
while(i == i) ;
System.out.println("Not infinite!");
74
задан Luke Francl 30 November 2009 в 21:24
поделиться

9 ответов

Вот как я добился этого.

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

    проверьте процесс delayed_job с помощью файла pidfile /var/www/app/shared/pids/delayed_job.pid[1277 sizesstart program = "/ var / www / app / current / script / delayed_job -e production start "
    stop program =" / var / www / app / current / script / delayed_job -e production stop "

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

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

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

  1. демоны гем должен быть установлен для выполнения 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 я обнаружил, что это помогает остановить инициализацию. d и запустите ее из командной строки th, чтобы вы могли получать сообщения об ошибках. В противном случае очень трудно понять, почему что-то идет не так.

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

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

97
ответ дан 24 November 2019 в 12:00
поделиться

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

2
ответ дан 24 November 2019 в 12:00
поделиться

Поскольку я не хотел запускаться от имени пользователя root, я закончил тем, что создал сценарий инициализации bash, который monit используется для запуска и остановки (PROGNAME будет абсолютным путем к script / delayed_job):

start() {
    echo "Starting $PROGNAME"
    sudo -u $USER /usr/bin/env HOME=$HOME RAILS_ENV=$RAILS_ENV $PROGNAME start
}

stop() {
    echo "Stopping $PROGNAME"
    sudo -u $USER /usr/bin/env HOME=$HOME RAILS_ENV=$RAILS_ENV $PROGNAME stop
}
1
ответ дан 24 November 2019 в 12:00
поделиться

Как бы то ни было, вы всегда можете использовать / 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.

8
ответ дан 24 November 2019 в 12:00
поделиться

Спасибо за сценарий.

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

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

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

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

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
ответ дан 24 November 2019 в 12:00
поделиться

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

Итак, мой задержка_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
ответ дан 24 November 2019 в 12:00
поделиться

Я обнаружил, что проще создать сценарий инициализации для отложенного задания. Он доступен здесь: 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"

и это отлично работает!

5
ответ дан 24 November 2019 в 12:00
поделиться

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

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

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

1
ответ дан 24 November 2019 в 12:00
поделиться

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

My schedule.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
ответ дан 24 November 2019 в 12:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: