Я пытаюсь настроить Resque worker в качестве сценария инициализации Upstart, который будет использоваться Monit в приложении Rails. Я не сисоп, и я попытался написать это, используя примеры из другого сценария инициализации, который есть на нашем сервере, вот что у меня получилось:
start on startup
stop on shutdown
pre-start script
cd /var/www/my-app/current
end script
script
exec bundle exec rake environment resque:work RAILS_ENV=staging PIDFILE=/var/run/resque.pid QUEUE=sync >> /var/log/resque.log
end script
Но это не сработает, если я попробую sudo start resque
Я получил:
resque start/running, process XXXX
Насколько я знаю, ничего не запускается, нет ни процесса восстановления, ни файла журнала. Я совершенно не понимаю, как заставить его работать.
Обновить: Я нашел файл системного журнала, и он говорит:
Nov 4 17:20:09 fantasysports init: resque main process (3057) terminated with status 2
Обновить: Я попытался запустить его с помощью sudo (да, это не имеет смысла!) И удалил перенаправление вывода в файл журнала, и теперь я получаю другой код состояния:
Nov 4 17:29:44 fantasysports init: resque main process (3276) terminated with status 10
Обновить: Закончил отказ от Upstart для init.d, поскольку start-stop-daemon
гораздо лучше документирован и дает мне полный контроль над тем, что происходит.
Вот как я это делаю .. это тоже добавляет в rvm
start on startup
stop on starting rcS
chdir /data/pusher/current
env RAILS_ENV=production
script
/usr/local/bin/rvm-shell '1.9.2@app' -c 'JOBS_PER_FORK=25 RAILS_ENV=production QUEUE=app_production bundle exec rake --trace resque:work >> /data/app/current/log/app-worker.production.log 2>&1'
end script
Изменить: вот как я это делаю для работы под другим пользователем ... chdir, похоже, не уважается ... так что это своего рода хакерство
start on runlevel [2345]
stop on starting rcS
chdir /data/app/current
env RAILS_ENV=production
script
sudo -u user -s -- "cd /data/app/current; export RAILS_ENV=production; /usr/local/bin/rvm-shell '1.9.2-p180@app' -c 'QUEUE=app_production bundle exec rake resque:work >> /data/app/current/log/app-worker.production.log 2>&1'"
end script
Вам в значительной степени нужно перейти в правильный каталог и установить RAILS_ENV в команде sudo
Возможно, вам стоит взглянуть на Формана: http://ddollar.github.com/foreman/ который имеет возможность экспортировать в выскочку и рекомендуется для управления спасателями в ряде постов, включая этот: http://michaelvanrooijen.com/articles/2011/06/08-managing-and-monitoring-your-ruby-application-with-foreman-and-upstart/
То, как руководство RVM в разделе "Интеграция" рекомендует для "Использование служб на основе RVM и Ruby, запускаемых через init.d или upstart"- использовать псевдонимы и оболочки RVM.
У меня была ситуация, когда мне приходилось контролировать bluepill
обработать. Этот процесс является демоном, поэтому процесс выполняется 2 раза. Начиная с rvm-shell
команда добавила третью вилку ... из-за которой Upstart не мог отслеживать процесс PID
(он может отслеживать процессы max только до второй вилки - если задан expect daemon
строфа).
Я решил это следующим образом:
Сначала я создал псевдоним RVM для своей среды:
rvm alias create my_app ruby-2.0.0-p247@my_app
Затем я использовал следующую конфигурацию выскочки для своей работы:
`# /etc/init/bluepill_my-app.conf
description "my_app Bluepill"
start on runlevel [2]
stop on runlevel [016]
setuid my-app
setgid my-app
expect daemon
respawn
env USER=my-app
env HOME=/var/www/my-app/
env RAILS_ENV=my-app
env BLUEPILL_BASE_DIR=/tmp/bluepill_my-app
chdir /var/www/my-app/current/
exec /var/www/my-app/.rvm/wrappers/my-app/bundle exec bluepill --no-privileged load /var/www/my-app/current/config/deploy/monitoring/my-app.pill >> /tmp/upstart.log 2>&1
`
Bundler должен быть установлен в данном гемсете, на который указывает псевдоним RVM.
Вызов bundler
сценарий-оболочка не вызывает вилок, подобных rvm-shell
команда делает.
Альтернативой может быть установка bluepill
gem в используемом gemset, создайте для него сценарий-оболочку и используйте его напрямую, без пакета exec - точно так же, как предлагает руководство RVM - но используя его через bunlder
позволяет синий .pill
файлы для использования любой библиотеки, используемой в моем приложении (например, setingslogic
и т.д.).
Это немного не по теме, но я думаю, что это хороший пример того, как это сделать лучше. Надеюсь, это поможет.