Erstellen Sie einen Windows-Dienst aus einer ausführbaren Datei

349

Gibt es eine schnelle Möglichkeit, bei einer ausführbaren Datei einen Windows-Dienst zu erstellen, der beim Start gestartet wird?

Deutscher Latorre
quelle
8
Hier finden Sie Anweisungen von Microsoft, wie Sie dies erreichen können.
PiRX

Antworten:

460

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 exePfad und ein Leerzeichen nach dem setzen binPath=.

Weitere Informationen zum scBefehl 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.

Sergii Pozharov
quelle
11
Sie müssen (mit ziemlicher Sicherheit) die Eingabeaufforderung als Administrator ausführen, damit dieser Befehl funktioniert
Jeutnarg
2
Der Pfad muss auch der vollständig qualifizierte Pfad sein. Ich konnte meinen Dienst nicht dazu bringen, einen relativen Pfad zu verwenden.
RunOfTheShipe
4
Das Leerzeichen danach 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.
2
Der Speicherplatz danach binPath=wurde für mich unter Windows 7 benötigt, aber nicht unter Windows 10
23.
242

Verwenden Sie NSSM ( den nicht saugenden Service Manager ), um eine .BAT- oder eine beliebige .EXE-Datei als Service auszuführen.

http://nssm.cc/

  • Schritt 1 : Laden Sie NSSM herunter
  • Schritt 2 : Installieren Sie Ihren Service mitnssm.exe install [serviceName]
  • Schritt 3 : Dadurch wird eine GUI geöffnet, mit der Sie Ihre ausführbare Datei suchen
Kevin Tong
quelle
6
Bester Service Manager aller Zeiten. Ich habe es sogar geschafft, PlexWatch mit NSSM als Dienst zu installieren.
Imperativ
2
Ist dieses Set ein Service für immer? Jedes Mal, wenn Windows startet, wird der Dienst gestartet? auch wie kann ich das ohne benutzerinteraktion machen? ein Skript oder ein Code?
John Demetriou
9
Das ist absolut großartig, ich wünschte, ich könnte diese Antwort anstelle der ersten akzeptieren :-(
Deutscher Latorre
2
Ich kann Dropbox als Dienst auf dem Server ausführen. Absolut ein nicht saugendes Werkzeug!
Barry Guvenkaya
1
Muss die exe-Datei ein Windows-Dienstprojekt sein, um mit nssm arbeiten zu können, oder kann es sich um eine normale exe-Datei handeln? Eingabeaufforderung usw.
Sanjeev
92

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

Geben Sie hier die Bildbeschreibung ein

Weitere Informationen unter: https://nssm.cc/usage


quelle
4
Richtige Syntax 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]
Hammad Khan
1
Ich gehe davon aus, dass der Verweis auf nginx darin besteht, dass dies das spezielle Programm ist, das Sie als Dienst ausführen möchten. Bis ich den Kommentar von hmd oben gesehen habe, dachte ich, Sie wollten helfen, indem Sie andeuteten, dass Nginx eine erforderliche Abhängigkeit für die Installation ist oder so ... aber in der GUI sieht es so aus, als würden Sie Nginx nicht installieren, sondern ein Unreal Tournament Server? Ich möchte nur darauf hinweisen, dass das Beispiel inkonsistent und möglicherweise irreführend ist. Ein einfaches "Angenommen, Sie wollten nginx als Dienst installieren, dann würde es so aussehen:" würde helfen.
Flutefreak7
@ flutefreak7 ja nginxist 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.
Hammad Khan
1
Wenn ich versuche, nssm zu verwenden, wird Windows Forms ausgeführt, aber das Formular wird nicht angezeigt ... Warum?
Radenko Zec
Es führt Ihre Anwendung als Windows-Dienst aus, die meisten sind für das Backend. Es kann auch sein, dass es als ein anderer Root / Admin-Benutzername ausgeführt wird. du musst es überprüfen. Weitere Informationen finden Sie hier: nssm.cc/usage
16

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. 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 to the system.
   -->
  <persistent_env name="FOO_SERVICE_PORT" value="8989" />
</service>
KFL
quelle
9

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.

PodTech.io
quelle
Es gibt weder einen INSTALL-Befehl noch in meiner My Win 2003 sc.exe 5.2.3790.3959, noch in M $ F1
user6698332
1
Verwenden Sie "create" anstelle von "install". sc create <service_name> binpath= <binary_path>
CSquared
4

Ich habe dafür ein gutes Produkt getestet: AlwaysUp . Nicht kostenlos, aber sie haben eine 30-tägige Testphase, damit Sie es ausprobieren können ...

A. Masson
quelle