Мы используем виртуальную машину на основе 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
линия, похоже, не действует.
Во-первых, ваша проблема заключается в неправильном отслеживании вилок. Чтобы решить эту проблему, я собираюсь внести несколько изменений в вашу конфигурацию выскочки:
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.