Как демонизировать скрипт Rails с помощью bluepill

Я всегда успешно использовал bluepill для демонизации простых скриптов на Ruby. Однако на этот раз у меня есть скрипт, который также загружает среду Rails, чтобы я мог получить доступ к своему соединению с базой данных для приложения Rails и его соответствующих моделей. Конфигурация bluepill, которую я использую, ничем не отличается от того, что я обычно делаю:

   Bluepill.application("myapp", :foreground => true, :log_file => "/tmp/bluepill.log") do |app|
          app.process("myapp_process") do |process|
            process.start_command = "/usr/local/rvm/rubies/ruby-1.9.3-p194/bin/ruby /media/apps/myapp/current/lib/async/myscript.rb"
            process.pid_file = "/media/apps/myapp/current/tmp/pids/myscript.pid"
            process.daemonize = true
            process.stdout = "/var/log/myapp/media.log"
            process.stderr = "/var/log/myapp/media_error.log"
            process.working_dir = "/tmp"
            process.stop_command = "kill -QUIT {{PID}}"
            process.start_grace_time = 15.seconds
          end
    end

Основная проблема заключается в этой ошибке:

Failed to signal process 16096 with code 0: No such process

Если я не загружаю среду Rails, используя это:

require File.expand_path("/media/apps/myapp/current/config/environment")

Это будет работать так же, как и с кучей других моих скриптов. Однако я впервые пытаюсь демонизировать скрипт, который загружает среду Rails. Я знаю, что могу использовать демоны ruby ​​gem, чтобы заставить это работать, но это не делает мониторинг, и bluepill способен выполнять оба эти действия очень хорошо.

Я что-то упускаю здесь очевидное?

4 ответа

Сигнальный код от 0 до kill Запросы, чтобы определить, восприимчив ли демон к сигналам. Источник Bluepill показывает, что это часто делается после нереста, чтобы проверить, жив ли и хорошо ли процесс демона.

Поскольку процесса больше нет, вполне вероятно, что ruby ​​умирает при загрузке среды.

Вы не показали свой сценарий. Я предполагаю, что он работает нормально из командной строки, но не может демонизироваться. Вероятное объяснение состоит в том, что в среде вашей оболочки что-то отсутствует в процессе Bluepill. Другой возможностью является доступ к ресурсам, которые есть в вашей интерактивной оболочке, но процесс безголового демона - нет.

Вот одно предположение: для require Вы дали на работу, я считаю, RAILS_ENV переменная окружения должна быть установлена. Ты это делаешь? Смотрите, например, эту заметку. Возможно, лучше загрузить с помощью загрузочного скрипта. Смотрите, например, описание инициализации Rails.

Знаете ли вы, что вы можете запустить скрипт в среде rails с rails runner также? Вы можете попробовать это.

У меня не было большой удачи с bluepill, у меня был намного больший успех с глазом: https://github.com/kostya/eye

Вы можете проверить это, он имеет тот же синтаксис, что и bluepill.

Хм. Некоторое время мы пробовали bluepill, но это не помогло во многих случаях, когда процессы имели сложные запуски. В последнее время мы были более счастливы с "runit", который имеет ряд сопутствующих компонентов (например, chpset для установки пользователя, среды и т. Д.), Которые очень полезны. Мы используем инструменты devops, такие как chef, чтобы настроить машины со стандартными сервисами, и runit подошел лучше. Но для любого из них вам нужен pid запущенного процесса, о котором вы заботитесь, чтобы иметь возможность получать сигналы от системы мониторинга - похоже, здесь PID, который вы получаете от вашей команды запуска:

/media/apps/myapp/current/lib/async/myscript.rb

не тот, который продолжает работать - может быть, если вы опубликуете больше этого скрипта, мы сможем увидеть, что происходит, но я предполагаю, что где-то он отключается от другого процесса?

На этом сайте https://github.com/arya/bluepill/issues/164 я нашел эту информацию

После некоторых экспериментов я обнаружил, что если вы запускаете команды с флагом --no-privileged, а также с флагами base dir и logfile, это работает. Они также включены в конфигурацию, так что это немного избыточно: /

Пример команд: пакет exec bluepill load bluepill/monitorbs.pill --no-privileged --base-dir /xxx/xxx/xxx --logfile /xxx/xxx/xxx/bluepill/bs.log"

Другие вопросы по тегам