Як відстежувати delayed_job за допомогою monit


74

Чи є в Інтернеті приклади того, як контролювати delayed_job за допомогою Monit ?

Все, що я можу знайти, використовує Бога , але я відмовляюся використовувати Бога, оскільки тривалі процеси в Ruby загалом відмовні. (Найновіший пост у списку розсилки Бога ? Використання пам’яті Бога постійно зростає .)

Оновлення: delayed_job тепер поставляється із зразком конфігурації monit, заснованої на цьому питанні.


jacobrothstein.com/entries/delayed-job-and-monit Не впевнений, наскільки це добре, я не пробував такий підхід /
Джо Пім

Відповіді:


97

Ось як я отримав цю роботу.

  1. Використовуйте fork від колективного відбору delayed_job, крім того, що він активно підтримується, ця версія має приємний script/delayed_jobдемон, який ви можете використовувати з monit. У Railscasts є хороший епізод про цю версію delayed_job( версія ASCIICasts ). Цей сценарій також має деякі інші приємні функції, такі як можливість запускати декількох працівників. Я тут цього не висвітлюю.
  2. Встановіть monit. Я встановив з джерела, оскільки версія 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"

    Я зберігаю це в моїй системі управління сукре і вказую на це за include /var/www/app/current/config/monitдопомогою/etc/monit/monitrc файлі.

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

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

  1. daemonsдля script/delayed_jobзапуску потрібно встановити самоцвіт .
  2. Ви повинні пройти рейки середу для 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 та запустити її з цього командного рядка, щоб ви могли отримувати повідомлення про помилки. В іншому випадку дуже важко зрозуміти, чому справи йдуть не так.

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

Сподіваємось, це допомагає наступній людині, яка хоче стежити за delayed_jobдопомогою monit.


Гарна ідея. Я розправився з вами, щоб ви були такими, як я описав у своїй відповіді: gist.github.com/176007 (ваш не помиляється чи щось інше, мені просто подобається мати мої файли монітів під SCM, що вимагає дещо інших інструкцій)
Люк Франкл

1
Я дотримувався кроків і видав команду: sudo monit start delayed_job monit: Не вдається знайти файл управління за адресою ~ / .monitrc, / etc / monitrc, / usr / local / etc / monitrc, / usr / local / etc / monitrc або at ./monitrc Але це помилки !. Ви стикалися з такими проблемами? Я на Ubuntu Intrepid (локальний)
Autodidact

Ви компілювали monit із джерела за допомогою ./configure --sysconfdir=/etc/monit? Я отримував цю помилку, але встановлення sysconfdir виправило її для мене.
Luke Francl

10
NBThe -e/--environment option has been deprecated and has no effect. Use RAILS_ENV and see http://github.com/collectiveidea/delayed_job/issues/#issue/7
розбірливий

Чудова порада, успішно встановлена ​​остання версія delayed_job (1.8.4, яка постачається із модифікованим \ contrib \ delayed_job.monitrc), дякую!
dolzenko

8

Для того, що це варто, ви завжди можете використовувати / 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

Я виявив, що було простіше створити скрипт ініціалізації для відкладеної роботи. Він доступний тут: http://gist.github.com/408929 або нижче:

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

справа "$ 1" в
  почати)
        echo -n "Початок delayed_job:"
                su - rails -c "$ set_path; RAILS_ENV = сценарій підготовки / відкладений_запуск роботи" >> /var/log/delayed_job.log 2> & 1
        ехо "виконано".
        ;;
  Стоп)
        echo -n "Зупинка сфінкса:"
                su - rails -c "$ set_path; RAILS_ENV = сценарій підстановки / зупинка відкладеної роботи" >> /var/log/delayed_job.log 2> & 1
        ехо "виконано".
        ;;
      *)
            N = / etc / init.d / stayed_job_staging
            echo "Використання: $ N {старт | зупинка}"> & 2
            вихід 1
            ;;
    esac

    вихід 0

Потім переконайтеся, що monit налаштовано на запуск / перезапуск програми, так у вашому файлі monitrc:

перевірити процес delayed_job за допомогою pidfile "/path_to_my_rails_app/shared/pids/delayed_job.pid"
запустити програму = "/etc/init.d/delayed_job start"
зупинити програму = "/etc/init.d/delayed_job stop"

і це чудово працює!


5

Я знайшов хороший спосіб почати delayed_job з cron при завантаженні. Я використовую будь-коли для управління cron.

Мій графік.rb:

# користувальницький тип завдання для управління відкладеною роботою
job_type: delayed_job, 'cd: path; RAILS_ENV =: скрипт середовища / delayed_job ": завдання"'

# відкладений початок роботи під час завантаження
кожне: перезавантажити
  delayed_job "старт"
кінець

Примітка: Я щоразу оновлював gem до версії 0.5.0, щоб мати можливість використовувати тип_запису


2

Я не знаю з Monit, але я написав пару плагінів Munin для моніторингу розміру черги та середнього часу роботи. Зміни, які я вніс до delayed_job у цьому патчі, також можуть полегшити вам написання плагінів Monit на випадок, якщо ви дотримуєтесь цього.


2

Дякую за сценарій.

Один Гоча - з моніт за визначенням має «спартанський шлях» з

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

... і для мене був встановлений / зв’язаний рубін у / usr / local / bin, мені довелося годинами крутити, намагаючись з’ясувати, чому моніт мовчки не спрацьовує при спробі перезапустити 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

Мені довелося поєднати рішення на цій сторінці з іншим сценарієм, зробленим 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"

не працює, там написано: "/ bin / su: su: потрібно запускати з терміналу"
Лев Лукомський

2

Якщо ваш моніт працює як root, і ви хочете запустити delayed_job як my_user, зробіть це:

/etc/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

/var/www/my_app/shared/monit/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

/ etc / monit / monitrc :

# add at bottom
include /var/www/my_app/shared/monit/*

1

Оскільки я не хотів запускати як 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

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

Ось стаття, яку я про це писав: http://modernagility.com/articles/5-monitoring-delayed_job-and-its-jobs

Цей плагін контролюватиме ваш відкладений робочий процес та надсилатиме вам електронне повідомлення у випадку аварії delayed_job або якщо одне з його завдань не вдасться.


Ваше посилання переводить мене на сторінку профілю, а не статтю про затримку роботи
Шон,

1

Для 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'"

0

Я зіткнувся з проблемою, коли затримана робота помре, коли вона все ще буде заблокована, ця робота не буде звільнена. Я написав сценарій обгортки навколо відкладеної роботи, який перегляне файл pid і звільнить будь-які робочі місця від померлого працівника.

Сценарій для гуми / капістрано

role / delayedjob / delayed_job_wrapper:

<% @path = '/etc/monit/monit.d/monit-delayedjob.conf' %>
<% workers = 4 %>
<% workers.times do |i| %>
<% PIDFILE = "/mnt/custora-#{RUBBER_ENV}/shared/pids/delayed_job.#{i}.pid" %>
<%= "check process delayed_job.#{i} with pidfile #{PIDFILE}"%>
group delayed_job-<%= RUBBER_ENV %>
<%= " start program = \"/bin/bash /mnt/#{rubber_env.app_name}-#{RUBBER_ENV}/current/script/delayed_job_wrapper #{i} start\"" %>
<%= " stop program = \"/bin/bash /mnt/#{rubber_env.app_name}-#{RUBBER_ENV}/current/script/delayed_job_wrapper #{i} stop\"" %>
<% end %>

role / delayedjob / delayed_job_wrapper

#!/bin/bash
<%   @path = "/mnt/#{rubber_env.app_name}-#{RUBBER_ENV}/current/script/delayed_job_wrapper" %>

<%= "pid_file=/mnt/#{rubber_env.app_name}-#{RUBBER_ENV}/shared/pids/delayed_job.$1.pid" %>
if [ -e $pid_file ]; then
 pid=`cat $pid_file`
 if [ $2 == "start" ]; then
   ps -e | grep ^$pid
   if [ $? -eq 0 ]; then
     echo "already running $pid"
     exit
   fi
   rm $pid_file
 fi

locked_by="delayed_job.$1 host:`hostname` pid:$pid"

<%="   /usr/bin/mysql -e \"update delayed_jobs set locked_at = null, locked_by = null where locked_by='$locked_by'\" -u#{rubber_env.db_user} -h#{rubber_instances.for_role('db', 'primary' => true).first.full_name}  #{rubber_env.db_name} " %>

fi
<%= "cd /mnt/#{rubber_env.app_name}-#{RUBBER_ENV}/current" %>

. /etc/profile
<%= "RAILS_ENV=#{RUBBER_ENV} script/delayed_job -i $1 $2"%>

0

щоб побачити, що відбувається, запустіть monit у детальному режимі переднього плану: sudo monit -Iv

за допомогою rvmвстановлених під користувачем "www1" та групи "www1".

у файлі /etc/monit/monitrc:

#delayed_job
check process delayed_job with pidfile /home/www1/your_app/current/tmp/pids/delayed_job.pid
    start program "/bin/bash -c 'PATH=$PATH:/home/www1/.rvm/bin;source /home/www1/.rvm/scripts/rvm;cd /home/www1/your_app/current;RAILS_ENV=production bundle exec script/delayed_job start'" as uid www1 and gid www1
    stop program "/bin/bash -c 'PATH=$PATH:/home/www1/.rvm/bin;source /home/www1/.rvm/scripts/rvm;cd /home/www1/your_app/current;RAILS_ENV=production bundle exec script/delayed_job stop'" as uid www1 and gid www1
    if totalmem is greater than 200 MB for 2 cycles then alert
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.