Diese Bibliothek kann zum Installieren/Starten/Stop/Deinstallieren von Knotenskripten als Windows -Hintergrunddienste für Produktionsumgebungen verwendet werden. Dies ist kein Werkzeug für die Entwicklung von Anwendungen, sondern ein Werkzeug zur Freigabe. Dieses Tool generiert eine ausführbare Datei, mit der Ihre App mit der Version von node.js auf dem Computer installiert ist.
Siehe Node-MAC- und Knoten-Linux, wenn Sie diese Betriebssysteme unterstützen müssen.
Tweet mich (@goldglovecb), wenn du mich brauchst.
![]() | ![]() | ![]() | ![]() |
Kann nicht sponsern? Betrachten Sie @CoreyButler für einen Github -Star. | |||
Die folgenden Funktionen sind in Node-Windows erhältlich:
exec -Befehl als sudoer aus.Die empfohlene Methode zur Installation von Knoten-Windows ist mit NPM mit dem globalen Flag:
npm install -g node-windows
Rennen Sie in Ihrem Projektwurzel:
npm link node-windows
Jedoch; Es ist möglich, Knoten-Windows ohne das globale Flag zu verwenden (dh direkt in das Projektroot installiert). Weitere Details darüber, warum dies nicht der empfohlene Ansatz ist, finden Sie in diesem Readme.
Die Verwendung natives Knotenmodule an Fenstern kann saugen. Die meisten nativen Module sind nicht in einem binären Format verteilt. Stattdessen stützen sich diese Module auf npm , um das Projekt zu erstellen, wobei Node-GYP verwendet wird. Dies bedeutet, dass Entwickler Visual Studio (und möglicherweise andere Software) auf dem System installieren müssen, um ein nationales Modul zu installieren. Dies ist tragbar, aber schmerzhaft ... vor allem, weil Visual Studio selbst über 2 GB ist.
Node-Windows verwendet keine nativen Module. Es gibt einige binäre/exe -Versorgungsunternehmen, aber alles, was für komplexere Aufgaben benötigt wird, wird in einem leicht verwendbaren Format verpackt und verteilt. Sie müssen also kein Visual Studio benötigen ... zumindest nicht für dieses Modul.
Node-Windows verfügt über ein Dienstprogramm, mit dem Node.js-Skripte als Windows-Dienste ausgeführt werden können. Bitte beachten Sie, dass das Erstellen eines für alle Windows -Dienste administrative Berechtigungen erfordert. Um einen Dienst mit Node-Windows zu erstellen, bereiten Sie ein Skript wie: vor:
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' ,
nodeOptions : [
'--harmony' ,
'--max_old_space_size=4096'
]
//, workingDirectory: '...'
//, allowServiceLogon: true
} ) ;
// Listen for the "install" event, which indicates the
// process is available as a service.
svc . on ( 'install' , function ( ) {
svc . start ( ) ;
} ) ;
svc . install ( ) ; Der obige Code erstellt ein neues Service und liefert einen hübschen Namen und eine hübsche Beschreibung. Das script identifiziert das Skript node.js, das als Dienst ausgeführt werden soll. Nach dem Ausführen wird das Skript vom Windows Services -Dienstprogramm aus sichtbar sein.
Das Service gibt die folgenden Ereignisse aus:
Im obigen Beispiel hört das Skript für das install an. Da diese Veranstaltung nach Abschluss einer Serviceinstallation abgefeuert wird, ist es sicher, den Service zu starten.
Dienste, die von Node-Windows erstellt wurden, ähneln den meisten anderen Diensten unter Windows. Sie können über das Windows Service -Dienstprogramm über NET START oder NET STOP -Befehle gestartet/gestoppt werden oder sogar mit dem SC -Dienstprogramm verwaltet werden.
Es kann erwünscht werden, dass Befehlszeilenschalter in Ihr Skript angeben. Sie können dies tun, indem Sie die scriptOptions in der Dienstkonfiguration einstellen:
var svc = new Service ( {
name : 'Hello World' ,
description : 'The nodejs.org example web server.' ,
script : 'C:\path\to\helloworld.js' ,
scriptOptions : '-c C:\path\to\somewhere\special -i'
} ) ;Manchmal möchten Sie einen Service mit statischen Daten anbieten, die zur Erstellung des Dienstes übergeben werden. Sie können dies tun, indem Sie Umgebungsvariablen in der Dienstkonfiguration einstellen, wie unten gezeigt:
var svc = new Service ( {
name : 'Hello World' ,
description : 'The nodejs.org example web server.' ,
script : 'C:\path\to\helloworld.js' ,
env : {
name : "HOME" ,
value : process . env [ "USERPROFILE" ] // service is now able to access the user who created its' home directory
}
} ) ;Sie können auch ein Array liefern, um mehrere Umgebungsvariablen festzulegen:
var svc = new Service ( {
name : 'Hello World' ,
description : 'The nodejs.org example web server.' ,
script : 'C:\path\to\helloworld.js' ,
env : [ {
name : "HOME" ,
value : process . env [ "USERPROFILE" ] // service is now able to access the user who created its' home directory
} ,
{
name : "TEMP" ,
value : path . join ( process . env [ "USERPROFILE" ] , "/temp" ) // use a temp directory in user's home directory
} ]
} ) ; Es gibt Zeiten, in denen Sie möglicherweise einen bestimmten node angeben möchten, der ausführbar ist, um Ihr Skript auszuführen. Sie können dies tun, indem Sie den execPath in der Dienstkonfiguration einstellen, wie unten gezeigt:
var svc = new Service ( {
name : 'Hello World' ,
description : 'The nodejs.org example web server.' ,
script : 'C:\path\to\helloworld.js' ,
execPath : 'C:\path\to\specific\node.exe'
} ) ;Wenn Sie einen bestimmten Benutzer oder bestimmten Anmeldeinformationen angeben müssen, um einen Dienst zu verwalten, können die folgenden Attribute hilfreich sein.
Das user ist ein Objekt mit drei Schlüssel: domain , account und password . Dies kann verwendet werden, um zu identifizieren, welcher Benutzer die Service Library verwenden sollte, um Systembefehle auszuführen. Standardmäßig ist die Domäne auf den lokalen Computernamen eingestellt, kann jedoch mit einer Active Directory- oder LDAP -Domäne überschrieben werden. Zum Beispiel:
app.js
var Service = require ( 'node-windows' ) . Service ;
// Create a new service object
var svc = new Service ( {
name : 'Hello World' ,
script : require ( 'path' ) . join ( __dirname , 'helloworld.js' ) ,
//, allowServiceLogon: true
} ) ;
svc . logOnAs . domain = 'mydomain.local' ;
svc . logOnAs . account = 'username' ;
svc . logOnAs . password = 'password' ;
... Sowohl das Konto als auch das Kennwort müssen explizit definiert werden, wenn das Service -Modul als bestimmte Benutzerbefehle ausgeführt wird. Standardmäßig wird es mit dem Benutzerkonto ausgeführt, das den Prozess gestartet hat (dh der wer node app.js gestartet hat).
Wenn Sie WinSW anweisen möchten, Servicekonto -Anmeldungen zuzulassen, geben Sie allowServiceLogon: true . Dies ist standardmäßig deaktiviert, da einige Benutzer Probleme haben, die dies ohne Serviceanmeldungen ausgeführt haben.
Das andere Attribut ist sudo . Dieses Attribut enthält eine einzelne Eigenschaft namens password . Durch die Lieferung wird das Servicemodul versucht, Befehle mithilfe des Benutzerkontos auszuführen, das den Prozess und das Kennwort für dieses Konto gestartet hat. Dies sollte nur für Konten mit administrativen Berechtigungen verwendet werden.
app.js
var Service = require ( 'node-windows' ) . Service ;
// Create a new service object
var svc = new Service ( {
name : 'Hello World' ,
script : require ( 'path' ) . join ( __dirname , 'helloworld.js' )
} ) ;
svc . sudo . password = 'password' ;
...Der Dienst kann auch von anderen Windows -Diensten abhängig gemacht werden.
var svc = new Service ( {
name : 'Hello World' ,
description : 'The nodejs.org example web server.' ,
script : 'C:\path\to\helloworld.js' ,
dependsOn : [ "serviceA" ]
} ) ;Das Deinstallieren eines zuvor erstellten Dienstes ähnelt syntaktisch der Installation.
var Service = require ( 'node-windows' ) . Service ;
// Create a new service object
var svc = new Service ( {
name : 'Hello World' ,
script : require ( 'path' ) . join ( __dirname , 'helloworld.js' )
} ) ;
// Listen for the "uninstall" event so we know when it's done.
svc . on ( 'uninstall' , function ( ) {
console . log ( 'Uninstall complete.' ) ;
console . log ( 'The service exists: ' , svc . exists ) ;
} ) ;
// Uninstall the service.
svc . uninstall ( ) ;Der Deinstallationsprozess beseitigt nur prozessspezifische Dateien. Es löscht Ihr Skript von Node.js nicht!
Viele Dinge!
Langzeitprozesse und Überwachung:
Die integrierte Servicewiederherstellung für Windows Services ist ziemlich begrenzt und kann nicht einfach aus dem Code konfiguriert werden. Daher erstellt Node-Windows einen Wrapper um das Skript node.js. Dieser Wrapper ist dafür verantwortlich, einen fehlgeschlagenen Dienst auf intelligente und konfigurierbare Weise neu zu starten. Wenn Ihr Skript beispielsweise aufgrund eines unbekannten Fehlers abstürzt, versuchen Node-Windows, es neu zu starten. Standardmäßig tritt dies jede Sekunde auf. Jedoch; Wenn das Skript einen fatalen Fehler aufweist, der es wiederholt zum Absturz bringt, fügt es dem System unnötigen Overhead hinzu. Knotenfenster verarbeitet dies, indem das Zeitintervall zwischen Neustarts erhöht und die maximale Anzahl von Neustarts abgeschlossen wird.
Intelligentere Neustarts, die Ihren Server nicht schließen:
Unter Verwendung der Standardeinstellungen fügt Node-Windows das Wartenintervall bei jedem Neustart des Skripts 25% hinzu. Bei der Standardeinstellung (1 Sekunde) tritt der erste Neustartversuch nach einer Sekunde auf. Die zweite tritt nach 1,25 Sekunden auf. Der dritte nach 1,56 Sekunden (1,25 stieg um 25%an) und so weiter. Sowohl die anfängliche Wartezeit als auch die Wachstumsrate sind Konfigurationsoptionen, die an einen neuen Service übergeben werden können. Zum Beispiel:
var svc = new Service ( {
name : 'Hello World' ,
description : 'The nodejs.org example web server.' ,
script : 'C:\path\to\helloworld.js' ,
wait : 2 ,
grow : .5
} ) ;In diesem Beispiel beginnt die Wartezeit bei 2 Sekunden und steigt um 50%. Der zweite Versuch wäre also 3 Sekunden später, während der vierte 4,5 Sekunden später dauern würde.
Dos nicht selbst!
Repetitive Recycling könnte möglicherweise für immer mit einem schlechten Drehbuch weitergehen. Um diese Situationen zu bewältigen, unterstützt Node-Windows zwei Arten von Kappen. Durch die Verwendung maxRetries wird die maximale Anzahl von Neustartversuchen begrenzt. Standardmäßig ist dies unbegrenzt. Wenn der Prozess auf 3 festgelegt wird, wird er feststellen, dass ein Prozess nicht mehr neu gestartet wird, nachdem er dreimal fehlgeschlagen ist. Eine weitere Option sind maxRestarts , die die Anzahl der innerhalb von 60 Sekunden versuchten Neustarts beschreitet. Wenn dies beispielsweise auf 3 (Standard) eingestellt ist und der Prozess wiederholt abfällt/neu startet, werden Node-Windows nach dem 3. Zyklus in einem 60-Sekunden-Fenster Neustartsversuche aufhören. Beide Konfigurationsoptionen können festgelegt werden, genau wie wait oder grow .
Schließlich kann ein Attribut namens abortOnError auf true eingestellt werden, wenn Ihr Skript bei einem Fehler überhaupt nicht neu gestartet wird.
Node-Windows verwendet das WINSW-Dienstprogramm, um ein eindeutiges .exe für jedes als Dienst bereitgestellte Skript von Node.js zu erstellen. Ein Verzeichnis namens daemon wird erstellt und mit myappname.exe und myappname.xml bevölkert. Die XML -Datei ist eine Konfiguration für die ausführbare Datei. Darüber hinaus erstellt winsw in diesem Verzeichnis einige Protokolle für sich selbst (die im Ereignisprotokoll angezeigt werden können).
Die Datei myappname.exe startet den Node-Windows-Wrapper, der für die Überwachung und Verwaltung des Skripts verantwortlich ist. Da diese Datei Teil von Node-Windows ist, kann das Verschieben des Node-Windows-Verzeichnisses dazu führen, dass die .exe Datei das Skript node.js nicht finden kann. Jedoch; Dies sollte kein Problem sein, wenn Node-Windows gemäß den empfohlenen Installationsanweisungen weltweit installiert werden.
Alle diese Daemon-spezifischen Dateien werden in einem Unterverzeichnis namens daemon erstellt, das im selben Verzeichnis erstellt wird, in dem das Skript node.js gespeichert ist. Durch das Deinstallieren eines Dienstes werden diese Dateien entfernt.
Ereignisprotokollierung
Dienste, die mit Node-Windows erstellt wurden, verfügen über zwei Ereignisprotokolle, die über den Windows Event Viewer angezeigt werden können. Eine Protokollquelle namens myappname.exe bietet eine grundlegende Protokollierung für die ausführbare Datei. Es kann verwendet werden, um zu erkennen, wann der gesamte Dienst startet/gestoppt wird oder Fehler aufweist. Ein zweites Protokoll, das nach Ihrem Dienstnamen benannt ist (dh mein App-Name), wird vom Node-Windows-Monitor verwendet. Es ist möglich, dieses Protokoll aus dem Skript node.js mit der Ereignisprotokollierung von Node-Windows zu schreiben.
Neu ab v0.1.0 ist ein nicht-C ++ -Steuerprogramm auf Ereignisprotokollierung. Dieses Dienstprogramm kann an das Ereignisprotokoll schreiben und Ihre Protokolle vom Event -Viewer sichtbar machen. Es verwendet Eventcreate unter der Motorhaube.
So erstellen Sie einen Logger:
var EventLogger = require ( 'node-windows' ) . EventLogger ;
var log = new EventLogger ( 'Hello World' ) ;
log . info ( 'Basic information.' ) ;
log . warn ( 'Watch out!' ) ;
log . error ( 'Something went wrong.' ) ;Sieht ähnlich aus:
Einige weniger verwendete Optionen sind auch über die Node-Windows-Event-Protokollierung erhältlich.
log . auditSuccess ( 'AUser Login Success' ) ;
log . auditFailure ( 'AUser Login Failure' ) ; Jeder Protokolltyp (Info, Warn, Fehler, Auditsuccess und AuditFailure) akzeptiert optional zwei zusätzliche Argumente, einschließlich eines Code und Rückrufs . Standardmäßig ist der Ereigniscode 1000 , wenn nicht anders angegeben. Um einen benutzerdefinierten Ereigniscode mit einer Protokollnachricht bereitzustellen und diese Nachricht an die Konsole zu schreiben, kann der folgende Code verwendet werden:
Hinweis: Es scheint, dass Eventcreate nur die <= 1000 von Custom ID unterstützt.
log . info ( 'Something different happened!' , 700 , function ( ) {
console . log ( 'Something different happened!' ) ;
} ) ; Standardmäßig sind Ereignisprotokolle Teil des APPLICATION . Jedoch; Es ist auch möglich, das SYSTEM zu verwenden. Dazu muss ein Konfigurationsobjekt an das neue Protokoll übergeben werden:
var EventLogger = require ( 'node-windows' ) . EventLogger ;
var log = new EventLogger ( {
source : 'My Event Log' ,
eventLog : 'SYSTEM'
} ) ;Warnveranstaltungsprotokolle, die vom Wrapper erzeugt werden, können unterdrückt werden, indem es beim Erstellen des Dienstes deaktiviert wird. Warnprotokolle sind standardmäßig aktiviert.
var svc = new Service ( {
name : 'Hello World' ,
description : 'The nodejs.org example web server.' ,
disableWarningLogs : true ,
} ) ;Node-Windows versendet mehrere Befehle, um die Aufgaben unter MS Windows zu vereinfachen.
Elevate ähnelt sudo unter Linux/Mac. Es wird versucht, die Berechtigungen des aktuellen Benutzers zu einem lokalen Administrator zu erhöhen. Wenn Sie dies verwenden, ist kein Kennwort erforderlich, aber der aktuelle Benutzer verfügt über administrative Berechtigungen. Ohne diese Privilegien fehlschlägt der Befehl mit einem access denied .
Auf Systemen mit aktiviertem UAC kann dies den Benutzer zur Erlaubnis zur Fortsetzung auffordern:
Syntax :
elevate(cmd[,options,callback])
require('child_process').exec(cmd,<OPTIONS>,callback) .require('child_process').exec(cmd,options,<CALLBACK>) . Sudo wirkt ähnlich wie sudo unter Linux/Mac. Im Gegensatz zu Elevate erfordert es ein Kennwort, fordert den Benutzer jedoch nicht auf die Erlaubnis zur Fortsetzung auf. Wie bei Elevate erfordert dies immer noch Verwaltungsberechtigungen für den Benutzer, da der Befehl ansonsten fehlschlägt. Der Hauptunterschied zwischen diesem und Elevate () ist die Eingabeaufforderung.
Syntax :
sudo(cmd,password[,options,callback])
require('child_process').exec(cmd,<OPTIONS>,callback) .require('child_process').exec(cmd,options,<CALLBACK>) . Dieser asynchrone Befehl bestimmt, ob der aktuelle Benutzer über administrative Berechtigungen verfügt. Es gibt einen booleschen Wert an den Rückruf übergeben und gibt true zurück, wenn der Benutzer ein Administrator oder false ist, wenn dies nicht der Fall ist.
Beispiel
var wincmd = require ( 'node-windows' ) ;
wincmd . isAdminUser ( function ( isAdmin ) {
if ( isAdmin ) {
console . log ( 'The user has administrative privileges.' ) ;
} else {
console . log ( 'NOT AN ADMIN' ) ;
}
} ) ; Die Listenmethode fragt das Betriebssystem nach einer Liste der laufenden Prozesse ab.
var wincmd = require ( 'node-windows' ) ;
wincmd . list ( function ( svc ) {
console . log ( svc ) ;
} , true ) ; Dies gibt eine Reihe von Laufprozessen zurück. Die Lieferung des optionalen true Arguments im obigen Beispiel bietet eine Liste mit ausführlicher Ausgabe. Die Ausgabe ist spezifisch für die Version des Betriebssystems. Hier ist ein Beispiel für die ausführliche Ausgabe auf einem Windows 8 -Computer.
[ {
ImageName : 'cmd.exe' ,
PID : '12440' ,
SessionName : 'Console' ,
'Session#' : '1' ,
MemUsage : '1,736 K' ,
Status : 'Unknown' ,
UserName : 'Machine\Corey' ,
CPUTime : '0:00:00' ,
WindowTitle : 'N/A'
} , {
ImageName : 'tasklist.exe' ,
PID : '1652' ,
SessionName : 'Console' ,
'Session#' : '1' ,
MemUsage : '8,456 K' ,
Status : 'Unknown' ,
UserName : 'Machine\Corey' ,
CPUTime : '0:00:00' ,
WindowTitle : 'N/A'
} ] Die reguläre (nonverbose) Ausgabe liefert typischerweise den ImageName , PID , SessionName , Session# , MemUsage und CPUTime .
Diese Methode tötet einen Prozess durch PID ab.
var wincmd = require ( 'node-windows' ) ;
wincmd . kill ( 12345 , function ( ) {
console . log ( 'Process Killed' ) ;
} ) ; In diesem Beispiel würde Process ID 12345 getötet. Es ist wichtig zu beachten, dass das Benutzerkonto, das dieses Knotenskript ausführt, möglicherweise administrative Berechtigungen erfordern.
Wenn Sie Probleme mit den Beispielen haben, überprüfen Sie bitte die Datei TESTS.md .
Wenn Sie auf das Ereignis von InvalidInstallation stoßen, schauen Sie sich das daemon -Verzeichnis an, das während der Installation erstellt wird, um sicherzustellen, dass die Dateien .exe und .xml vorhanden sind. Unter bestimmten Umständen ist es vor allem während der _un_installation möglich, dass der Prozess eine Protokolldatei vorübergehend sperren, die das Entfernen von Windows verhindert. Führen Sie in diesem Szenario einfach die Deinstallation erneut aus. In den meisten Fällen wird das Problem behoben. Wenn nicht, entfernen Sie das daemon -Verzeichnis manuell, bevor Sie die Installation erneut ausführen.
Es gab viele Mitwirkende, die alles getan haben, von den Begehörungen von Funktionen bis hin zur Aufnahme von Slack, während ich überflutet wurde. Ich bin unglaublich dankbar für die Hilfe.
Besonderer Dank geht an @arthurblake, dessen Modifikationen endlich hinzugefügt wurden. Vielen Dank an @hockeytim11, der eine Reihe herausragender Themen zusammengestellt und aktualisiert und die anderen Knotenbibliotheken unterstützt.
Winsw und Sudowin sind die Urheberrechte ihrer jeweiligen Besitzer. WinSW wird unter einer MIT -Lizenz verteilt. Sudowin wird unter einer BSD -Lizenz verteilt.
Alle anderen Skripte sind Copyright (C) Corey Butler unter einer MIT -Lizenz.
(Die MIT -Lizenz)
Copyright (C) 2013 Corey Butler
Die Erlaubnis wird hiermit einer Person, die eine Kopie dieser Software und zugehörigen Dokumentationsdateien (die 'Software') erhält, kostenlos erteilt, um die Software ohne Einschränkung zu behandeln, einschließlich der Verwendung der Rechte zur Verwendung, kopieren, modifizieren, verschmolzen, veröffentlichen, veröffentlichen, verteilen, untermessen und/oder Kopien der Software verkaufen, um Personen, die auf die Bedingungen zu versehen sind, zu den Bedingungen, die an die folgenden Bedingungen nachgefragt werden.
Die oben genannte Copyright -Mitteilung und diese Erlaubnisbekanntmachung müssen in alle Kopien oder wesentlichen Teile der Software enthalten sein.
Die Software wird "wie ist" ohne Garantie jeglicher Art, ausdrücklich oder stillschweigend bereitgestellt, einschließlich, aber nicht beschränkt auf die Gewährleistung der Handelsfähigkeit, die Eignung für einen bestimmten Zweck und die Nichtverletzung. In keinem Fall sind die Autoren oder Urheberrechtsinhaber für Ansprüche, Schäden oder andere Haftungen haftbar, sei es in einer Vertragsklage, unerbittlich oder auf andere Weise, die sich aus oder im Zusammenhang mit der Software oder anderen Geschäften in der Software ergeben.