ruby beanstalkd god

ruby - Dios comienza demasiados procesos.



beanstalkd god (4)

Tengo un script de dios que se supone que vigila dos procesos de acosador. El problema es que después de 24 horas comienza demasiados procesos.

Este es el guión de Dios.

rails_root = File.expand_path("../..", __FILE__) 2.times do |n| God.watch do |w| w.group = "app-scripts" w.name = "run-#{n}" w.interval = 30.seconds w.dir = File.dirname(__FILE__) w.env = { "BUNDLE_GEMFILE" => "#{rails_root}/Gemfile", "RAILS_ENV" => "production", "BEANSTALK_URL" => "beanstalk://127.0.0.1:54132" } w.start = "bbundle exec stalk #{File.join(rails_root, "config/jobs.rb")}" w.start_grace = 5.seconds w.stop_grace = 5.seconds w.start_if do |start| start.condition(:process_running) { |c| c.running = false } end w.restart_if do |restart| restart.condition(:memory_usage) do |c| c.above = 200.megabytes c.times = [3, 5] end restart.condition(:cpu_usage) do |c| c.above = 95.percent c.times = 5 end end w.lifecycle do |on| on.condition(:flapping) do |c| c.to_state = [:start, :restart] c.times = 5 c.within = 5.minute c.transition = :unmonitored c.retry_in = 10.minutes c.retry_times = 5 c.retry_within = 2.hours end end end end

ps aux | grep stalk ps aux | grep stalk devuelve lo siguiente.

root 3178 0.2 2.7 417580 117284 ? Sl Oct28 2:22 ruby /opt/www/myapp/shared/bundle/ruby/1.9.1/bin/stalk /opt/www/myapp/current/config/jobs.rb root 3179 0.2 3.3 506068 138740 ? Sl Oct28 2:26 ruby /opt/www/myapp/shared/bundle/ruby/1.9.1/bin/stalk /opt/www/myapp/current/config/jobs.rb root 4588 0.2 2.9 497932 121664 ? Sl Oct25 16:10 ruby /opt/www/myapp/shared/bundle/ruby/1.9.1/bin/stalk /opt/www/myapp/current/config/jobs.rb root 4794 0.2 3.0 497792 128084 ? Sl Oct25 15:57 ruby /opt/www/myapp/shared/bundle/ruby/1.9.1/bin/stalk /opt/www/myapp/current/config/jobs.rb root 10391 0.2 2.8 496784 121388 ? Sl Oct25 15:44 ruby /opt/www/myapp/shared/bundle/ruby/1.9.1/bin/stalk /opt/www/myapp/current/config/jobs.rb root 10392 0.2 2.8 497624 121528 ? Sl Oct25 15:31 ruby /opt/www/myapp/shared/bundle/ruby/1.9.1/bin/stalk /opt/www/myapp/current/config/jobs.rb root 18874 75.0 2.0 214116 83948 ? Rl 15:49 0:09 ruby /opt/www/myapp/shared/bundle/ruby/1.9.1/bin/stalk /opt/www/myapp/current/config/jobs.rb root 18875 75.0 2.0 214944 84868 ? Rl 15:49 0:09 ruby /opt/www/myapp/shared/bundle/ruby/1.9.1/bin/stalk /opt/www/myapp/current/config/jobs.rb root 20649 0.2 2.6 410636 110012 ? Sl Oct28 2:44 ruby /opt/www/myapp/shared/bundle/ruby/1.9.1/bin/stalk /opt/www/myapp/current/config/jobs.rb root 20650 0.2 3.0 439284 128996 ? Sl Oct28 2:47 ruby /opt/www/myapp/shared/bundle/ruby/1.9.1/bin/stalk /opt/www/myapp/current/config/jobs.rb root 23272 0.2 2.7 414452 115772 ? Sl Oct28 2:44 ruby /opt/www/myapp/shared/bundle/ruby/1.9.1/bin/stalk /opt/www/myapp/current/config/jobs.rb root 23273 0.2 2.7 417728 117152 ? Sl Oct28 2:44 ruby /opt/www/myapp/shared/bundle/ruby/1.9.1/bin/stalk /opt/www/myapp/current/config/jobs.rb root 25919 0.2 3.1 436276 131876 ? Sl Oct28 2:28 ruby /opt/www/myapp/shared/bundle/ruby/1.9.1/bin/stalk /opt/www/myapp/current/config/jobs.rb root 25920 0.2 3.3 503236 138676 ? Sl Oct28 2:29 ruby /opt/www/myapp/shared/bundle/ruby/1.9.1/bin/stalk /opt/www/myapp/current/config/jobs.rb root 28782 0.2 2.8 431836 121108 ? Sl Oct25 16:58 ruby /opt/www/myapp/shared/bundle/ruby/1.9.1/bin/stalk /opt/www/myapp/current/config/jobs.rb root 30687 0.2 2.7 415908 117008 ? Sl Oct28 2:39 ruby /opt/www/myapp/shared/bundle/ruby/1.9.1/bin/stalk /opt/www/myapp/current/config/jobs.rb root 30688 0.2 2.6 476184 111844 ? Sl Oct28 2:37 ruby /opt/www/myapp/shared/bundle/ruby/1.9.1/bin/stalk /opt/www/myapp/current/config/jobs.rb

Este es el /usr/bin/bbundle .

#!/usr/bin/env bash if [[ -s "/home/webmaster/.rvm/environments/ruby-1.9.2-p320@webmaster" ]] then source "/home/webmaster/.rvm/environments/ruby-1.9.2-p320@webmaster" bundle "$@" else echo "ERROR: Missing RVM environment file: ''/home/webmaster/.rvm/environments/ruby-1.9.2-p320@webmaster''" >&2 exit 1 fi

  • Ejecutar sudo god stop app-scripts no eliminará ningún proceso.

  • He intentado agregar w.uid = "webmaster" al script de dios, pero el problema continúa.

  • Estoy ejecutando la versión 0.12.1 , la versión 1.9.3p286 y la versión 0.9.0 1.9.3p286 .

¿Qué estoy haciendo mal?


El apilador se detiene cuando recibe una señal INT (no una señal TERM ). Intente agregar una señal de parada:

# ... w.stop_signal = ''INT'' # ...


Esto debería ayudar con tu pregunta: monitorea una tarea de Rake con Dios .

En resumen, puede almacenar una referencia a su archivo PID en su configuración de dios:

God.watch do |w| w.dir = "#{rails_root}" w.name = "my_task" w.interval = 10.seconds w.pid_file = "#{rails_root}/tmp/pids/#{w.name}.pid" w.env = {"RAILS_ENV"=>rails_env, ''PIDFILE'' => w.pid_file} w.start = "bundle exec rake my_task &" ... end

y en su proceso de ejecución, escribe a este archivo su PID (en este ejemplo, rake):

task :my_task => :environment do File.open(ENV[''PIDFILE''], ''w'') { |f| f << Process.pid } if ENV[''PIDFILE''] Model.perform_task! end

Pasamos la ruta del archivo PID. Dios está observando el proceso que realmente se está observando y que escribe su PID en ese archivo (que luego Dios supervisa). Espero que esto ayude.


Parece que god está tratando de seguir bbundle y no stalk . w.pid_file informar a god dónde encontrar el PID del proceso real que desea seguir con w.pid_file . También puede ser necesario que le diga cómo matar el proceso, si una kill estándar no funciona. Para eso, puede usar w.stop_signal para una señal diferente (como lo sugiere Simonmenke) o w.stop para un comando completamente diferente.

El archivo de registro debería arrojar más luz sobre lo que está sucediendo. Llame a god -D para imprimirlo en stdout o god -l /var/log/god.log .


Resolví el problema gracias a mpapis @ the rvm irc. Tuve que cambiar la línea 6 en el script bbundle del bundle "$@" al exec bundle "$@" .

#!/usr/bin/env bash if [[ -s "/home/webmaster/.rvm/environments/ruby-1.9.2-p320@webmaster" ]] then source "/home/webmaster/.rvm/environments/ruby-1.9.2-p320@webmaster" exec bundle "$@" else echo "ERROR: Missing RVM environment file: ''/home/webmaster/.rvm/environments/ruby-1.9.2-p320@webmaster''" >&2 exit 1 fi