Antworten:
Spät zur Party, aber auch Node-Windows .
Es ist auch eine Systemprotokollierung integriert.
Es gibt eine API zum Erstellen von Skripten aus Code, z
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: Ich bin der Autor dieses Moduls.
Ich fand das Ding so nützlich, dass ich einen noch einfacher zu verwendenden Wrapper darum herum baute ( npm , github ).
Installation:
npm install -g qckwinsvc
Installieren Ihres Dienstes:
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
Deinstallation Ihres Dienstes:
qckwinsvc --uninstall
prompt: Service name: [name of your service]
prompt: Node script path: [path of your node script]
Service stopped
Service uninstalled
WinSer ist ein Node.js-freundlicher Wrapper um den beliebten NSSM (Non-Sucking Service Manager).
Als nächstes wollte ich Node als Service hosten, genau wie IIS. Auf diese Weise würde es mit meinem Computer gestartet, im Hintergrund ausgeführt, automatisch neu gestartet, wenn es abstürzt und so weiter.
Hier kommt nssm , der nicht saugende Servicemanager, ins Spiel . Mit diesem Tool können Sie eine normale EXE-Datei als Windows-Dienst hosten.
Hier sind die Befehle, die ich verwendet habe, um eine Instanz Ihrer Knotenanwendung als Dienst einzurichten, Ihren cmd-ähnlichen Administrator zu öffnen und die folgenden Befehle einzugeben:
nssm.exe install service_name c:\your_nodejs_directory\node.exe c:\your_application_directory\server.js net start service_name
Ich gehe nicht direkt auf die Frage ein, sondern biete eine Alternative, die Ihre Anforderungen möglicherweise auch auf eine andere Art und Weise erfüllt.
Funktionell sind die Anforderungen:
Diese Anforderungen können erfüllt werden, indem ein Prozessmanager (PM) verwendet wird und der Prozessmanager beim Systemstart gestartet wird. Zwei gute PMs, die Windows-freundlich sind, sind:
Um die PM automatisch zu starten, ist es am einfachsten, eine geplante Aufgabe mit dem Auslöser "Beim Start" zu erstellen:
pm2
ein Batch-Skript zu verwenden, müssen Sie die Umgebungsvariablen angeben, da dies sonst nicht funktioniert. Hier besprochen: github.com/Unitech/pm2/issues/1079
Der Prozessmanager + Taskplaner-Ansatz, den ich vor einem Jahr veröffentlicht habe, funktioniert gut mit einigen einmaligen Service-Installationen. Aber vor kurzem habe ich angefangen, Systeme in Form von Mikrodiensten zu entwerfen, wobei viele kleine Dienste über IPC miteinander sprechen. Die manuelle Konfiguration jedes Dienstes ist daher unerträglich geworden.
Um das Ziel der Installation von Diensten ohne manuelle Konfiguration zu erreichen, habe ich serman erstellt , ein Befehlszeilentool (Installation mit npm i -g serman
), mit dem eine ausführbare Datei als Dienst installiert werden kann. Alles, was Sie schreiben müssen (und nur einmal schreiben müssen), ist eine einfache Dienstkonfigurationsdatei zusammen mit Ihrer ausführbaren Datei. Lauf
serman install <path_to_config_file>
wird den Dienst installieren. stdout
und stderr
sind alle protokolliert. Weitere Informationen finden Sie auf der Projektwebsite .
Eine funktionierende Konfigurationsdatei ist sehr einfach, wie unten gezeigt. Es hat aber auch viele nützliche Funktionen wie <env>
und <persistent_env>
unten.
<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>