Как демонизировать скрипт 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"