Respostas:
Tarde para a festa, mas as janelas do nó também farão o truque.
Ele também possui o log do sistema incorporado.
Existe uma API para criar scripts a partir do código, ou seja,
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();
FD: Eu sou o autor deste módulo.
Achei a coisa tão útil que criei um wrapper ainda mais fácil de usar ( npm , github ).
Instalando-o:
npm install -g qckwinsvc
Instalando seu serviço:
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
Desinstalando seu serviço:
qckwinsvc --uninstall
prompt: Service name: [name of your service]
prompt: Node script path: [path of your node script]
Service stopped
Service uninstalled
O WinSer é um empacotador amigável do node.js. em torno do popular NSSM (Non-Sucking Service Manager)
Em seguida, eu queria hospedar o nó como um serviço, assim como o IIS. Dessa forma, ele iniciaria com minha máquina, rodaria em segundo plano, reiniciaria automaticamente se travar e assim por diante.
É aqui que o nssm , o gerente de serviços que não sugam, entra em cena. Essa ferramenta permite que você hospede um .exe normal como um serviço do Windows.
Aqui estão os comandos que usei para configurar uma instância do aplicativo do nó como um serviço, abra o cmd como administrador e digite os seguintes comandos:
nssm.exe install service_name c:\your_nodejs_directory\node.exe c:\your_application_directory\server.js net start service_name
Não estou abordando a questão diretamente, mas fornecendo uma alternativa que também pode atender aos seus requisitos de uma maneira mais node.js.
Funcionalmente, os requisitos são:
Esses requisitos podem ser satisfeitos usando um gerenciador de processos (PM) e iniciando o gerenciador de processos na inicialização do sistema. Duas PMs boas que são compatíveis com o Windows são:
Para fazer o PM iniciar automaticamente, a maneira mais simples é criar uma tarefa agendada com o gatilho "Na inicialização":
pm2
usar um script em lotes na inicialização, inclua as variáveis de ambiente ou elas não funcionarão. Discutido aqui: github.com/Unitech/pm2/issues/1079
A abordagem do gerenciador de processos + agendador de tarefas que publiquei há um ano funciona bem com algumas instalações de serviços pontuais. Recentemente, porém, comecei a projetar o sistema de maneira microsserviços, com muitos pequenos serviços conversando via IPC. Portanto, a configuração manual de cada serviço se tornou insuportável.
Com o objetivo de instalar serviços sem configuração manual, criei o serman , uma ferramenta de linha de comando (instale com npm i -g serman
) para instalar um executável como serviço. Tudo o que você precisa escrever (e escrever apenas uma vez) é um arquivo de configuração de serviço simples, juntamente com o seu executável. Corre
serman install <path_to_config_file>
instalará o serviço. stdout
e stderr
estão todos registrados. Para mais informações, consulte o site do projeto .
Um arquivo de configuração de trabalho é muito simples, como demonstrado abaixo. Mas também possui muitos recursos úteis, como <env>
e <persistent_env>
abaixo.
<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>