Wie installiere ich node.js als Windows-Dienst?

130

Ich habe die ausführbare Datei node.js heruntergeladen . Wie kann ich diese ausführbare Datei als Windows-Dienst ausführen? Ich kann das Standardinstallationsprogramm node.js nicht verwenden, da mehrere Versionen von node.js gleichzeitig ausgeführt werden müssen.

TN.
quelle

Antworten:

187

Spät zur Party, aber auch Node-Windows .

Geben Sie hier die Bildbeschreibung ein

Es ist auch eine Systemprotokollierung integriert.

Geben Sie hier die Bildbeschreibung ein

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.

Corey
quelle
3
zweitens das "genial". Ich habe gerade Ihre Readme-Anweisungen befolgt und es hat sofort funktioniert - sehr selten! Nur eine Sache, die Sie der Readme-Datei hinzufügen möchten: So führen Sie das erstellte JS-Skript an der CLI aus: dh> Knoten set_up_win_service.js ...
Mike Nagetier
@Corey Wie kann ich das JXCore- Paket als Dienst mit diesem Modul ausführen ?
Madhur
@ Madhur - Theoretisch könnte es funktionieren, aber ich habe und habe nicht vor, es zu testen. node-windows verwendet eine Datei wrapper.js, die für die Überwachung / den Neustart verantwortlich ist. Dadurch wird das Knotenskript jedoch nur als untergeordneter Prozess gestartet. Es ist auch möglich, den ausführbaren Pfad zu konfigurieren (dh jx anstelle des Knotens). Theoretisch könnten Sie dies wahrscheinlich tun, aber ich habe keine Ahnung, auf welche Art von Macken Sie möglicherweise stoßen könnten.
Corey
@Corey Ich habe eine einfache HTTP-Node-App, aber sie scheint mit diesem Dienst nicht weiter zu laufen. Es wird installiert und startet einwandfrei, stoppt jedoch sofort. Jede Hilfe wäre sehr dankbar, Sir! Die Ereignisanzeige zeigt keine Fehler, sondern eine Warnung an: Untergeordneter Prozess [50732 - C: \ Programme \ nodejs \ node.exe --harmony "C: \ Benutzer \ bmechkov \ AppData \ Roaming \ npm \ Knotenmodule \ Knotenfenster \ lib \ wrapper.js "-f" C: \ dev \ Node \ abs_tips \ server.js "-l" NODE ABS TIPS "-g 0,25 -w 1 -r 3 -an] beendet mit 0
Mechkov
@Mechkov - Das Beenden mit einer 0 bedeutet einen erfolgreichen Exit. Können Sie das Skript erfolgreich ohne Knotenfenster ausführen?
Corey
40

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
Hariram Nandagopal
quelle
Danke, sehr einfach !! Quarky, es funktioniert für mich (Gewinn 10 64 Bit)
Furkan
“Npm ERR! asyncWrite ist keine Funktion. “„ npm ERR! pna.nextTick ist keine Funktion ”
Timwi
Vielen Dank, dies ist sehr einfach zu bedienen.
Enrique Flores
27

WinSer ist ein Node.js-freundlicher Wrapper um den beliebten NSSM (Non-Sucking Service Manager).

Predrag Stojadinović
quelle
Ich mag NSSM nicht, weil es davon ausgeht, dass es nicht saugt, weil es den Absturz der gehosteten Anwendung behandelt, also ist es tatsächlich das Saugen der gehosteten Anwendung. Ich mag es im Allgemeinen nicht, Microsoft die Schuld zu geben, nur weil es Microsoft ist.
Felice Pollano
2
@FelicePollano NSSM geht davon aus, dass es nicht saugt, da es die gehostete Anwendung überwacht, im Gegensatz zu anderen Lösungen wie srvany, die den Dienst in einem laufenden Zustand belassen, selbst wenn der verpackte Prozess abbricht.
Jürgen Steinblock
@ JürgenSteinblock das ist genau das, was ich gesagt habe: saugt die gehostete Anwendung, nicht der Service Manager selbst
Felice Pollano
2
@FelicePollano ein gehosteter Anwendungs-Exit bedeutet nicht unbedingt etwas Schlechtes. Der Punkt ist: NSSM reflektiert (oder kann reflektieren, wenn es richtig konfiguriert ist) den tatsächlichen Dienststatus, so dass der Dienst überwacht werden kann, anstatt nur einen laufenden Status wie andere Dienstmanager anzunehmen (als Benutzer kann ich den gehosteten Prozess beenden und srvary würde immer noch anzeigen der Dienst in einem laufenden Zustand).
Jürgen Steinblock
16

Aus diesem Blog

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
Michael Horojanski
quelle
14

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:

  1. Lassen Sie die Logik (App) im Hintergrund laufen
  2. In der Lage sein, die Logik zu starten / zu stoppen
  3. Starten Sie die Logik automatisch, wenn das System hochfährt

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:

Geben Sie hier die Bildbeschreibung ein

KFL
quelle
Wenn Sie versuchen, beim Start pm2ein Batch-Skript zu verwenden, müssen Sie die Umgebungsvariablen angeben, da dies sonst nicht funktioniert. Hier besprochen: github.com/Unitech/pm2/issues/1079
Steampowered
@steampowered wie geben Sie den PM2_Home-Pfad?
Charan Tej
0

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. stdoutund stderrsind 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>
KFL
quelle