Gibt es eine schnelle Möglichkeit, bei einer ausführbaren Datei einen Windows-Dienst zu erstellen, der beim Start gestartet wird?
Gibt es eine schnelle Möglichkeit, bei einer ausführbaren Datei einen Windows-Dienst zu erstellen, der beim Start gestartet wird?
Antworten:
So erstellen Sie einen Windows-Dienst aus einer ausführbaren Datei sc.exe
:
sc.exe create <new_service_name> binPath= "<path_to_the_service_executable>"
Sie müssen Anführungszeichen um den tatsächlichen exe
Pfad und ein Leerzeichen nach dem setzen binPath=
.
Weitere Informationen zum sc
Befehl finden Sie in Microsoft KB251192 .
Beachten Sie, dass dies nicht für jede ausführbare Datei funktioniert: Die ausführbare Datei muss ein Windows-Dienst sein ( dh ServiceMain implementieren ). Wenn Sie eine nicht dienstleistungsfähige ausführbare Datei als Dienst registrieren, wird beim Versuch, den Dienst zu starten, die folgende Fehlermeldung angezeigt:
Fehler 1053: Der Dienst hat nicht rechtzeitig auf die Start- oder Steuerungsanforderung reagiert.
Es gibt Tools, mit denen ein Windows-Dienst aus beliebigen ausführbaren Dateien erstellt werden kann. Beispiele für solche Tools finden Sie in den anderen Antworten.
binpath=
und die Notwendigkeit, den ausführbaren Pfad mit doppelten Anführungszeichen zu umgeben, ist zumindest für Windows 10 völlig falsch. Das Anführungszeichen ist genau dann erforderlich, wenn der Pfad Sonderzeichen wie Leerzeichen enthält. Außerdem spielt das Gehäuse (Klein- / Groß- / Großbuchstaben) keine Rolle, auch bei Variablennamen, und displayname="my service"
ist ein weiterer Vorteil, den Sie über die Befehlszeile weitergeben können, während Sie einen Dienst erstellen, der als erste Zeile ( Name
) bei angezeigt wird services.msc
.
binPath=
wurde für mich unter Windows 7 benötigt, aber nicht unter Windows 10
Verwenden Sie NSSM ( den nicht saugenden Service Manager ), um eine .BAT- oder eine beliebige .EXE-Datei als Service auszuführen.
nssm.exe install [serviceName]
Antwort erweitern (Kevin Tong).
Schritt 1: Laden Sie nssm-2.24.zip herunter und entpacken Sie es
Schritt 2: Über den Befehlszeilentyp:
C:\> nssm.exe install [servicename]
Die GUI wird wie folgt geöffnet (Beispiel: UT2003-Server). Durchsuchen Sie sie dann einfach zu: yourapplication.exe
Weitere Informationen unter: https://nssm.cc/usage
nssm.exe install [serviceName]
. Diese Lösung funktioniert, aber wenn Sie eine GUI-Anwendung haben, funktioniert sie unter Win Serever2003 nicht. Wenn Sie es später entfernen möchten, verwenden Sienssm.exe remove [youservicename]
nginx
ist nicht notwendig und irreführend. Der Befehl funktioniert auch ohne. Dies ist ein optionaler Parameter, wenn Sie den Dienstnamen über die Eingabeaufforderung angeben möchten.
Viele der vorhandenen Antworten beinhalten menschliches Eingreifen zur Installationszeit. Dies kann ein fehleranfälliger Prozess sein. Wenn viele ausführbare Dateien als Dienste installiert werden sollen, müssen Sie sie als letztes zur Installationszeit manuell ausführen.
In Richtung des oben beschriebenen Szenarios habe ich serman erstellt , ein Befehlszeilentool zum Installieren einer ausführbaren Datei als Dienst. 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 to the system.
-->
<persistent_env name="FOO_SERVICE_PORT" value="8989" />
</service>
Diese Extras erweisen sich als nützlich. Sie müssen als Administrator ausgeführt werden
sc create <service_name> binpath=<binary_path>
sc stop <service_name>
sc queryex <service_name>
sc delete <service_name>
Wenn Ihr Servicename Leerzeichen enthält, fügen Sie "Anführungszeichen" hinzu.
sc create <service_name> binpath= <binary_path>