Как установить node.js как службу Windows?

130

Я скачал исполняемый файл node.js. Как я могу запустить этот исполняемый файл как службу Windows? Я не могу использовать стандартный установщик node.js, поскольку мне нужно одновременно запускать несколько версий node.js.

Тонна
источник

Ответы:

187

Поздно к вечеринке, но окна узлов тоже подойдут.

введите описание изображения здесь

Он также имеет встроенный системный журнал.

введите описание изображения здесь

Есть API для создания скриптов из кода, т.е.

var Service = require('node-windows').Service;

// Create a new service object
var svc = new Service({
  name:'Hello World',
  description: 'The nodejs.org example web server.',
  script: 'C:\\path\\to\\helloworld.js'
});

// Listen for the "install" event, which indicates the
// process is available as a service.
svc.on('install',function(){
  svc.start();
});

svc.install();

ФД: Я автор этого модуля.

Corey
источник
3
второй, что "офигенно". Я просто следовал вашим инструкциям readme, и это сработало прямо из коробки - очень редко! только одно, что вы могли бы добавить в файл readme: как запустить созданный js-скрипт в интерфейсе командной строки: ie> node set_up_win_service.js ...
Майк грызун
@Corey каким-либо образом я могу запустить пакет JXCore как службу с помощью этого модуля?
Madhur
@Madhur - Теоретически может сработать, но я нет и не планирую тестировать. node-windows использует файл wrapper.js, который отвечает за мониторинг / перезапуск. Это просто запускает скрипт узла как дочерний процесс. Также можно настроить путь к исполняемому файлу (т.е. jx вместо node). Итак, теоретически вы, вероятно, могли бы это сделать, но я понятия не имею, с какими причудами вы потенциально можете столкнуться.
Кори
@Corey У меня есть простое приложение Http Node, но оно, похоже, не может работать с этой службой. Он устанавливается и запускается нормально, но немедленно останавливается. Любая помощь будет принята с благодарностью, сэр! Средство просмотра событий не показывает ошибок, но выдает предупреждение: Дочерний процесс [50732 - C: \ Program Files \ nodejs \ node.exe --harmony "C: \ Users \ bmechkov \ AppData \ Roaming \ npm \ node_modules \ node-windows \ lib \ wrapper.js "-f" C: \ dev \ Node \ abs_tips \ server.js "-l" NODE ABS TIPS "-g 0.25 -w 1 -r 3 -an] завершается с 0
Mechkov
@Mechkov - завершение с 0 означает успешный выход. Можете ли вы успешно запустить скрипт без окон узлов?
Кори
40

Я нашел эту вещь настолько полезной, что построил вокруг нее еще более простую в использовании оболочку ( npm , github ).

Устанавливаем его:

npm install -g qckwinsvc

Установка вашей службы:

qckwinsvc

prompt: Service name: [name for your service]
prompt: Service description: [description for it]
prompt: Node script path: [path of your node script]
Service installed

Удаление вашей службы:

qckwinsvc --uninstall

prompt: Service name: [name of your service]
prompt: Node script path: [path of your node script]
Service stopped
Service uninstalled
Харирам Нандагопал
источник
Спасибо, очень просто !! quarky, у меня это работает (win 10 64 бит)
Furkan
«Npm ERR! asyncWrite не является функцией »« npm ERR! pna.nextTick - это не функция »
Тимви,
Спасибо, это очень удобно.
Энрике Флорес
27

WinSer - это дружественная к node.js оболочка популярного NSSM (Non-Sucking Service Manager).

Предраг Стоядинович
источник
не нравится NSSM, потому что он предполагает, что это не всасывающий, потому что он обрабатывает сбой размещенного приложения, так что на самом деле это всасывающее приложение. Не люблю вообще обвинять Microsoft только потому, что это Microsoft.
Феличе Поллано
2
@FelicePollano NSSM предполагает, что он не является всасывающим, потому что он отслеживает размещенное приложение, в отличие от других решений, таких как srvany, которые оставляют службу в рабочем состоянии, даже если завернутый процесс умирает.
Юрген Штайнблок
@ JürgenSteinblock, это именно то, что я сказал: отстойное приложение, а не сам сервис-менеджер
Феличе Поллано
2
@FelicePollano - выход из размещенного приложения не означает ничего плохого. Дело в том, что NSSM отражает (или может отражать, если настроен правильно) реальное состояние службы, поэтому службу можно отслеживать, а не просто принимать рабочее состояние, как другие диспетчеры служб (как пользователь, я могу убить размещенный процесс, и srvary все равно будет показывать сервис в рабочем состоянии).
Юрген Штайнблок
16

Из этого блога

Затем я хотел разместить узел как службу, как IIS. Таким образом, он запускался с моей машиной, работал в фоновом режиме, автоматически перезапускался в случае сбоя и так далее.

Вот тут-то на сцену и выходит на сцену nssm , менеджер сервисов , не требующий всасывания. Этот инструмент позволяет размещать обычный EXE-файл в качестве службы Windows.

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

nssm.exe install service_name c:\your_nodejs_directory\node.exe c:\your_application_directory\server.js
net start service_name
Михаил Хорожанский
источник
14

Я не обращаюсь к этому вопросу напрямую, но предлагаю альтернативу, которая также может удовлетворить ваши требования в стиле, более подходящем для node.js.

Функционально требования:

  1. Пусть логика (приложение) работает в фоновом режиме
  2. Уметь запускать / останавливать логику
  3. Автоматически запускать логику при загрузке системы

Эти требования могут быть выполнены с помощью диспетчера процессов (PM) и запуска диспетчера процессов при запуске системы. Два хороших PM, дружественных к Windows:

Чтобы PM запускался автоматически, самый простой способ - создать запланированную задачу с триггером «При запуске»:

введите описание изображения здесь

КЛС
источник
Если вы попытаетесь запустить pm2пакетный сценарий при запуске, обязательно включите переменные среды, иначе он не сработает. Обсуждается здесь: github.com/Unitech/pm2/issues/1079
Steampowered
@steampowered, как указать путь PM2_Home?
charan tej
0

Менеджер процессов + планировщик задач подход я отправил год назад хорошо работает с какой - то один-офф установки службы. Но недавно я начал проектировать систему в стиле микросервисов, когда множество небольших сервисов общались друг с другом через IPC. Так что вручную настраивать каждую службу стало невыносимо.

Чтобы установить службы без ручной настройки, я создал serman , инструмент командной строки (установка с помощью npm i -g serman) для установки исполняемого файла как службы. Все, что вам нужно написать (и писать только один раз), - это простой файл конфигурации службы вместе с исполняемым файлом. Бегать

serman install <path_to_config_file>

установит сервис. stdoutи stderrвсе зарегистрированы. Для получения дополнительной информации посетите веб-сайт проекта .

Рабочий файл конфигурации очень прост, как показано ниже. Но он также имеет много полезных функций, таких как <env>и <persistent_env>ниже.

<service>
  <id>hello</id>
  <name>hello</name>
  <description>This service runs the hello application</description>

  <executable>node.exe</executable>

  <!-- 
       {{dir}} will be expanded to the containing directory of your 
       config file, which is normally where your executable locates 
   -->
  <arguments>"{{dir}}\hello.js"</arguments>

  <logmode>rotate</logmode>

  <!-- OPTIONAL FEATURE:
       NODE_ENV=production will be an environment variable 
       available to your application, but not visible outside 
       of your application
   -->
  <env name="NODE_ENV" value="production"/>

  <!-- OPTIONAL FEATURE:
       FOO_SERVICE_PORT=8989 will be persisted as an environment
       variable machine-wide.
   -->
  <persistent_env name="FOO_SERVICE_PORT" value="8989" />
</service>
КЛС
источник