Назад | Перейти на главную страницу

Upstart не может остановить сервисы foreverjs при завершении работы?

Сценарий

Мы используем виртуальную машину на основе Vagrant под управлением Ubuntu 12.04 LTS для разработки трех серверов Node.JS, которые запускаются с использованием foreverjs. Мы запускаем сервисы под vagrant user и смонтируйте проекты с хоста на виртуальную машину как общие папки.

При запуске скрипта с forever, после запуска он перейдет в фоновый режим, поддерживая центральный список всех запущенных скриптов (для каждого пользователя). Для скриптов, которые используют разные имена, вы можете ссылаться на них по имени, а также по числовому индексу.

Затем скрипты управляются (запускаются, перезапускаются, останавливаются и т. Д.) С помощью forever команда.

Конфигурация выскочки

Я создал похожие файлы конфигурации выскочки для каждой службы следующим образом:

description "Control server.js"

chdir /vagrant/server

start on vagrant-mounted

stop on runlevel [016]

expect fork

pre-start script
  test -d /vagrant/server
end script

exec sudo su vagrant -c "/usr/local/bin/forever start server.js"

Проблема - зависает при выключении

Выскочка успешно запускает службу после монтирования бродячей общей папки. Однако завершение работы виртуальной машины (т. Е. vagrant halt) зависает до истечения времени ожидания и принудительного выключения виртуальной машины.

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

Моя единственная попытка не сработала (она останавливает службу, но Vagrant зависает до истечения времени ожидания):

pre-stop script
  forever stop server.js
end script

Службы узлов не должны корректно завершаться: я был бы рад любому сценарию, который убивает сценарии, но не приводит к зависанию Vagrant при завершении работы.

Кроме того, удаление stop on runlevel линия, похоже, не действует.

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

  • Во-первых, откажитесь от использования su для смены пользователя. su не следует использовать для демонов, только для обычных пользователей (это может вызвать проблемы с запуском pam), и (что более важно) он переводит процесс в фоновый режим (Upstart труднее отслеживать и уничтожать вашего демона). Мы будем использовать setuid vagrant вместо этого в конфиге выскочки.
  • Следующая проблема в том, что навсегда отводит процесс на задний план. и уходит на задний план. Это заставляет Upstart отслеживать какой-то случайный pid, который, вероятно, даже больше не работает. Решение состоит в том, чтобы использовать функцию автоматического возрождения Upstart. Я продемонстрирую это на примере ниже.

    description "server.js"
    
    start on vagrant-mounted
    stop on runlevel [016]
    
    chdir /vagrant/server
    setuid vagrant
    
    respawn
    respawn limit unlimited
    
    exec server.js
    

Обратите внимание, что вам не нужно проверять, является ли / vagrant / server каталогом, потому что выскочка автоматически создает его из-за строфы chdir.