Cómo monitorear el trabajo retrasado con monit
¿Hay algún ejemplo en la web de cómo monitorear delayed_job con Monit?
Todo lo que puedo encontrar usa a Dios, pero me niego a usar a Dios ya que los procesos de ejecución larga en Ruby generalmente apestan. (El post más actual en la lista de correo de Dios? El Uso de la Memoria de Dios Crece Constantemente.)
Update: delayed_job ahora viene con un ejemplo de configuración de monit basado en esta pregunta.
13 answers
Así es como conseguí que esto funcionara.
- Use la bifurcación collectiveidea de delayed_job además de mantenerse activamente, esta versión tiene un buen demonio
script/delayed_job
que puede usar con monit. Railscasts tiene un buen episodio sobre esta versión dedelayed_job
(ASCIICasts version ). Este script también tiene algunas otras características interesantes, como la capacidad de ejecutar varios workers. No cubro eso aquí. - Instala monit. Instalé desde la fuente porque Ubuntu la versión está ridículamente desactualizada. Seguí estas instrucciones para obtener el init estándar.d scripts que vienen con los paquetes de Ubuntu. También necesitaba configurar con
./configure --sysconfdir=/etc/monit
para que el dir de configuración estándar de Ubuntu fuera recogido. -
Escribe un script monit. Esto es lo que se me ocurrió:
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"
Guardo esto en mi sistema de control soucre y apunto a monit con
include /var/www/app/current/config/monit
en el archivo/etc/monit/monitrc
. - Configurar monit. Estas instrucciones están cargadas de anuncios, pero por lo demás está bien.
- Escriba una tarea para que capistrano se detenga y comience.
monit start delayed_job
ymonit stop delayed_job
es lo que quieres ejecutar. También recargo monit al implementar para recoger cualquier cambio de archivo de configuración.
Problemas con los que me encontré:
-
daemons
la gema debe estar instalada para quescript/delayed_job
se ejecute. - Debe pasar el entorno Rails a
script/delayed_job
con-e production
(por ejemplo). Esto está documentado en el archivo README pero no en el salida de ayuda del script. - Uso Ruby Enterprise Edition, así que necesitaba que monit empezara con esa copia de Ruby. Debido a la forma en que sudo maneja la RUTA en Ubuntu, terminé enlazando
/usr/bin/ruby
y/usr/bin/gem
a las versiones REE.
Al depurar monit, encontré que ayuda detener el inicio.d versión y ejecutarlo desde la línea de comandos th, para que pueda obtener mensajes de error. De lo contrario, es muy difícil averiguar por qué van las cosas Equivocada.
sudo /etc/init.d/monit stop
sudo monit start delayed_job
Esperemos que esto ayude a la siguiente persona que quiera monitorear delayed_job
con monit.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:16:55
Por si sirve de algo, siempre puede usar /usr/bin/env con monit para configurar el entorno. Esto es especialmente importante en la versión actual de delayed_job, 1.8.4, donde la opción environment (-e) está obsoleta.
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"
En algunos casos, es posible que también necesite establecer la RUTA con env.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-12 14:55:31
Encontré que era más fácil crear un script de inicio para el trabajo retrasado. Está disponible aquí: http://gist.github.com/408929 o más abajo:
#! /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
Luego asegúrese de que monit esté configurado para iniciar / reiniciar la aplicación para que en su archivo 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"
Y eso funciona muy bien!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-21 14:58:23
Encontré una buena manera de comenzar delayed_job con cron en el arranque. Estoy usando siempre que para controlar cron.
Mi horario.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
Nota: Actualizé cada vez que gem a la versión 0.5.0 para poder usar job_type
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-30 07:26:28
No lo sé con Monit, pero he escrito un par de plugins de Munin para monitorear el Tamaño de la Cola y el Tiempo Promedio de Ejecución del Trabajo. Los cambios que hice en delayed_job en ese parche también podrían hacer que sea más fácil para usted escribir complementos Monit en caso de que se quede con eso.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-04 15:59:35
Gracias por el guión.
One gotcha since ya que monit por definición tiene un 'camino espartano' de
/bin:/usr/bin:/sbin:/usr/sbin
... y para mí ruby estaba instalado / enlazado en/usr/local / bin, tuve que revolotear durante horas tratando de averiguar por qué monit estaba fallando silenciosamente al intentar reiniciar delayed_job (incluso con-v para monit verbose mode).
Al final tuve que hacer esto:
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"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-05 13:46:48
Si tu monit se ejecuta como root y quieres ejecutar delayed_job como my_user entonces haz esto:
/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/*
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-30 13:32:15
Dado que no quería correr como root, terminé creando un script de inicio bash que monit usó para iniciar y detener (PROGNAME sería la ruta absoluta a 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
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-12 21:35:42
Tuve que combinar las soluciones de esta página con otro script hecho por toby para que funcionara con monit y comenzando con el usuario correcto.
Así que mi trabajo demorado.monitrc se ve así:
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"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-28 13:01:02
He dedicado bastante tiempo a este tema. Estaba harto de no tener una buena solución para ello, así que escribí el plugin delayed_job_tracer que aborda específicamente el monitoreo de delayed_job y sus trabajos.
He aquí un artículo que he escrito al respecto: http://modernagility.com/articles/5-monitoring-delayed_job-and-its-jobs
Este plugin monitorizará su proceso de trabajo retrasado y le enviará un correo electrónico si delayed_job se bloquea o si uno de sus trabajos falla.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-26 22:32:17
Para Rails 3, es posible que necesite configurar HOME env para que compass funcione correctamente, y debajo de la configuración funciona para mí:
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'"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-16 04:03:09
Me encontré con un problema en el que si el trabajo retrasado muere mientras todavía tiene un trabajo bloqueado, ese trabajo no se liberará. Escribí un script de envoltura alrededor del trabajo retrasado que mirará el archivo pid y liberará cualquier trabajo del trabajador muerto.
El guion es para rubber / capistrano
Roles / 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 %>
Roles/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"%>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-31 03:06:58
Para ver lo que está pasando, ejecute monit en modo detallado en primer plano: sudo monit -Iv
Usando rvm
instalado bajo el usuario "www1" y el grupo "www1".
En el archivo /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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-11 20:39:11