float i = Float.NaN;
while(i == i) ;
System.out.println("Not infinite!");
Вот как я добился этого.
script / delayed_job
, который вы можете использовать с monit. Railscasts содержит хороший эпизод об этой версии delayed_job
( ASCIICasts version ). Этот скрипт также имеет некоторые другие полезные функции, такие как возможность запускать несколько рабочих процессов. Я не говорю об этом здесь. ./ configure --sysconfdir = / etc / monit
, чтобы был выбран стандартный каталог конфигурации Ubuntu. Напишите сценарий мониторинга. Вот что я придумал:
проверьте процесс 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
.
monit start delayed_job
и monit stop delayed_job
- это то, что вы хотите запустить. Я также перезагружаю monit при развертывании, чтобы зафиксировать любые изменения файла конфигурации. Проблемы, с которыми я столкнулся:
демоны
гем должен быть установлен для выполнения script / delayed_job
. script / delayed_job
с помощью -e production
(например). Это задокументировано в файле README, но не в выводе справки скрипта. / usr / bin / ruby
и / usr / bin / gem
на версии REE. При отладке monit я обнаружил, что это помогает остановить инициализацию. d и запустите ее из командной строки th, чтобы вы могли получать сообщения об ошибках. В противном случае очень трудно понять, почему что-то идет не так.
sudo /etc/init.d/monit stop
sudo monit start delayed_job
Надеюсь, это поможет следующему человеку, который захочет отслеживать delayed_job
с помощью monit.
Я не знаю Monit, но я написал пару плагинов Munin для мониторинга размера очереди и среднего времени выполнения задания. Изменения, которые я внес в delayed_job в этом патче, могут также упростить вам написание плагинов Monit, если вы будете придерживаться этого.
Поскольку я не хотел запускаться от имени пользователя 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
}
Как бы то ни было, вы всегда можете использовать / 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.
Спасибо за сценарий.
Одна проблема - поскольку 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"
Мне пришлось объединить решения на этой странице с помощью другого скрипта , сделанном 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"
Я обнаружил, что проще создать сценарий инициализации для отложенного задания. Он доступен здесь: 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"
и это отлично работает!
Я потратил довольно много времени на эту тему. Мне надоело не иметь для этого хорошего решения, поэтому я написал плагин delayed_job_tracer, который специально занимается мониторингом delayed_job и его заданий.
Вот статья, которую я написал об этом: http://modernagility.com/articles/5-monitoring-delayed_job-and-its-jobs
Этот плагин будет отслеживать процесс отложенной работы и отправить вам электронное письмо, если delayed_job выйдет из строя или если одно из его заданий не удастся.
Я нашел хороший способ запустить 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