2013-02-25 3 views
3

Я использую foreman для запуска приложений node.js на рабочих серверах (ubuntu server 12). У Формана есть отличный инструмент для создания скриптов для выскочки.Приоритет upstart и init.d

Проблема заключается в том, что при перезагрузке сервера мое приложение (управляемое мастером) запускается до redis-сервера, и я должен создать некоторые трюки, чтобы дождаться действительного соединения.

Идеальное решение для запуска redis-сервера раньше и при запуске приложения-узла при запуске.

конфигурации

загрузки:

  • Redis-сервер запущен /etc/init.d/redis-server и /etc/rc2.d/S20redis-server
  • мое приложение узел запускается /etc/init/stocks-streamer*.conf

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

start on (started redis-server) 

Я полагаю, что это потому, что нет событий отправляются из init.d скриптов в выскочку, но, возможно, есть способ, который я не знаю?

Спасибо заранее за помощь!

ответ

1

Возможно, вам нужно запустить redis от мастера, чтобы вы могли лучше контролировать все зависимости вашего приложения.

Или убедитесь, что бригадир начинают гораздо позже, чем Redis (сделать ссылку уверен Формана в /etc/rc2.d перечислен позже, чем S20 *

Еще одна альтернатива:. Есть Redis сервер также быть запущен выскочка, этот ., скорее всего, будут помогать выскочке управлять зависимостями

Есть объяснения о том, как сделать это здесь: https://gist.github.com/bdotdub/714533

И я предлагаю использовать «Start должен предшествовать другой сервис» вместо (http://upstart.ubuntu.com/cookbook/#start-must-precede-another-service), так что Redis запускается при вы начинаете собственное обслуживание.

+0

Проблема в том, что у меня нет следов сценария выскочки в /etc/rc2.d. Upstart использует события для запуска и остановки скриптов. Я думаю, что мне нужно выпустить событие из сценария redis-server, но я не нахожу, как это сделать. –

+0

Я обновил свой ответ, чтобы предложить запустить redis с выскочкой. Это должно заставить работу «начать» работать, как ожидалось, если upstart управляет всеми зависимостями. –

0

Поскольку этот вопрос не имеет принятого ответа, и, учитывая, что у меня была такая же проблема, я решил, что я предлагаю другое решение. Вопрос можно было бы переформулировать как:

Как выполнить задачу выскочки на сценарий init.d?

Как указывает OP в вопросе, при запуске скрипта init.d возможно выпустить событие выскочки. Таким образом, выскочка может иметь простую декларацию start on started SCRIPT_NAME.

В моем случае, используя собственный заказ на основе CentOS, мой /etc/rc.d/rc отвечает за выполнение скриптов sysvinit (init.d). Этот скрипт полностью раскрывается, и поэтому он выдает выскочки для каждого скрипта sysvinit, который запускается/останавливается.

Другими словами, /etc/rc.d/rc скрипт имеет что-то вроде этого (упрощенный, чтобы оставить сочный материал):

for i in /etc/rc$runlevel.d/S* ; do 
    subsys=${i#/etc/rc$runlevel.d/S??} 
    initctl emit --quiet starting JOB=$subsys 
    $i start 
    initctl emit --quiet started JOB=$subsys 
done 

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

Вы можете подождать несколько событий в стартовой задаче. См. this вопрос о том, как узнать, какие события доступны (я не нашел лучшей документации, если честно).

В частности, трюк grep -r emit кажется очень полезным.

Смежные вопросы