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ón1.9.3p286
y la versión0.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