Подтвердить что ты не робот

Бог начинает слишком много процессов

У меня есть бог script, который должен следить за двумя процессами сталкера. Проблема в том, что через 24 часа запускает слишком много процессов.

Это бог script.

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 возвращает следующее.

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

Это /usr/bin/bbundle script.

#!/usr/bin/env bash

if [[ -s "/home/webmaster/.rvm/environments/[email protected]" ]]
then
  source "/home/webmaster/.rvm/environments/[email protected]"
  bundle  "[email protected]"
else
  echo "ERROR: Missing RVM environment file: '/home/webmaster/.rvm/environments/[email protected]'" >&2
  exit 1
fi
  • Запуск sudo god stop app-scripts не приведет к уничтожению каких-либо процессов.

  • Я попробовал добавить w.uid = "webmaster" к богу script, но проблема остается.

  • Я запускаю версию god 0.12.1, ruby ​​version 1.9.3p286 и версию stalker 0.9.0.

Что я делаю неправильно?

4b9b3361

Ответ 1

Я решил проблему благодаря mpapis @rvm irc. Мне пришлось изменить строку 6 в bbundle script от bundle "[email protected]" до exec bundle "[email protected]".

#!/usr/bin/env bash

if [[ -s "/home/webmaster/.rvm/environments/[email protected]" ]]
then
  source "/home/webmaster/.rvm/environments/[email protected]"
  exec bundle  "[email protected]"
else
  echo "ERROR: Missing RVM environment file: '/home/webmaster/.rvm/environments/[email protected]'" >&2
  exit 1
fi

Ответ 2

Кажется, что god пытается следовать bbundle, а не stalk. Вы должны сообщить god, где найти PID текущего процесса, с которым вы хотите следовать, w.pid_file. Вам также может потребоваться сообщить, как убить процесс, если стандартный kill не будет делать трюк. Для этого вы можете использовать w.stop_signal для другого сигнала (как предлагалось simonmenke) или w.stop для всей другой команды.

Файл журнала должен пролить свет на то, что происходит. Вызовите god -D для печати на stdout или god -l /var/log/god.log.

Ответ 3

Штабелер останавливается, когда он получает сигнал INT (а не сигнал TERM). Попробуйте добавить сигнал остановки:

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

Ответ 4

Это должно помочь с вашим вопросом: Отслеживать задачу Rake с Богом.

Короче говоря, вы можете сохранить ссылку на свой файл PID в своей конфигурации god:

 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

и в вашем текущем процессе вы пишете в этот файл свой PID (в этом примере, rake):

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

Мы передаем путь к файлу, который божественный файл PID смотрит на процесс, который на самом деле просматривается, и который записывает свой PID в этот файл (который затем контролирует бог). Надеюсь, это поможет.