Führen Sie die Batchdatei als Windows-Dienst aus

159

Um eine Anwendung ausführen zu können, muss eine Batch-Datei gestartet werden (z. B. Jetty starten, Live-Protokolle anzeigen usw.). Die Anwendung funktioniert nur, wenn diese Batchdatei ausgeführt wird. Ich bin daher gezwungen, diese Batchdatei auszuführen und mich nicht vom Windows-Server abzumelden.

Kann diese Batchdatei als Dienst ausgeführt werden? Ich experimentiere mit einem der Vorschläge aus einer ähnlichen Frage .

publicRavi
quelle
27
Die Stapelprogrammierung ist ein Thema für Stack Exchange.
Harry Johnston
12
Gute Frage. +1. Moderatoren sind zu wütend ... Auch ich habe noch eine gute Antwort, aber Frage geschlossen ((
Gavenkoa
Ich benutze stattdessen diesen RunAsService: runasservice.com . Es ist viel, viel einfacher zu bedienen. Kein Unsinn bei der XML-Konfiguration. Grundsätzlich erhalten Sie nur die ausführbare Datei RunAsService.exe, die jede Konsolenanwendung mit Befehlszeilenargumenten als Dienst umschließt. Ich benutze dies, um Cygwin-Bash-Skripte als Dienste auszuführen !!! Leider scheint dieses einfache Tool Closed-Source zu sein.
Kaz
8
Nominierung für die Wiedereröffnung auf der Grundlage von "Software-Tools, die üblicherweise von Programmierern verwendet werden". Was die Antwort auf diese Frage definitiv ist. Denken Sie auch daran, dass dies das erste Google-Ergebnis ist, wenn Sie nach "Windows-Start-Batch-Datei als Dienst" suchen. Ob es sich also um einen engen Bereich handelt, den einige Moderatoren für "Themen" halten, denkt der Rest der Welt. Ich stimme hier für Pragmatismus gegenüber Dogmatismus.
Adam Cameron
Eine ähnliche Frage finden Sie unter serverfault serverfault.com/questions/54676/…
Stephen Quan

Antworten:

151

NSSM ist völlig kostenlos und sehr einfach und führt die Eingabeaufforderung / das Terminal als Administrator aus:

nssm install "YourCoolServiceNameLabel"

Anschließend wird ein Dialogfeld angezeigt, in dem Sie auswählen können, wo sich die Datei befindet, die Sie ausführen möchten.

zu deinstallieren

nssm remove "YourCoolServiceNameLabel"
Junior Mayhé
quelle
25
+1 Ich habe noch nie davon gehört, aber es ist sehr schön. NSSM saugt in der Tat nicht!
Byron Whitlock
1
Ich habe 2 Minuten gebraucht, um einen Dienst zu installieren
Ben Wilde
3
@ Junior M Danke !! Du hast mich gerettet. Ich habe 4 Stunden dafür verbracht. Vielen Dank!!
Verystrongjoe
2
Wissen Sie, ob es eine Möglichkeit gibt, nssmalle erforderlichen Argumente bei der Eingabe anzugeben, um die Eingabe von Popup-Daten zu vermeiden? Ich versuche, den Prozess zu automatisieren.
Amphibient
1
NSSM wird bei einigen unserer Kunden immer wieder von GDATA Antivirus gelöscht. Ja, ich weiß, Whitelisting ... aber Kunden tun nicht, was für sie gut ist. Das ist die traurige Wahrheit.
Dreamspace Präsident
61

Warum nicht einfach als geplante Aufgabe einrichten, die beim Start ausgeführt werden soll?

Stephen Martin
quelle
1
Ich habe eine Reihe von Batchdateien, die Sicherungen per Robocopy durchführen und die ich über die geplanten Aufgaben (siehe Systemsteuerung, Geplante Aufgaben) starte, die auf einem Win 2003-Server ausgeführt werden. Arbeitet ein Vergnügen ...
SAL
Haben Sie dies einfach mit einem Skript getan, das wir zur Überwachung unseres Sicherungsdienstes verwendet haben. Es wirkt wie ein Zauber.
music2myear
1
das ist die beste lösung imo. Keine Software von Drittanbietern erforderlich und keine Befehlszeilenschnittstelle. Außerdem bietet der Taskplaner viele Optionen für Auslöser, Bedingungen usw.
dev
3
Funktioniert jetzt, da ich Folgendes herausgefunden habe: Wenn die Aufgabe beim Start ausgeführt wird (mit "Ausführen, ob der Benutzer angemeldet ist oder nicht")% UserProfile% ist C: \ Users \ Default \ Zu jedem anderen Zeitpunkt ist dies das erwartete C: \ Users \ ExpectedUser \ Dies kann zu mysteriösen Fehlern bei einigen .bat-Dateien führen, die bei anderen geplanten Aufgaben anscheinend einwandfrei funktionieren.
user1754036
2
Geplante Aufgaben sind notorisch unzuverlässig - ich bin tatsächlich auf diese Frage gestoßen, weil ich Probleme mit Aufgaben hatte, die nicht ohne ersichtlichen Grund pünktlich gestartet wurden.
22

Dazu gibt es ein eingebautes Windows-Cmd: sc create . Nicht so schick wie nssm, aber Sie müssen keine zusätzliche Software herunterladen.

sc create "ServiceName" start= demand displayname= "DisplayName" binpath= [path to .bat file]

Hinweis

  • start = demand bedeutet, dass Sie den Dienst selbst starten müssen
  • Leerzeichen sind nach erforderlich =
  • Beim Start des Dienstes ist ein Fehler aufgetreten, dass der Dienst nicht rechtzeitig reagiert hat, aber es war klar, dass der Dienst die .bat erfolgreich ausgeführt hat. Ich habe mich noch nicht damit befasst, aber dieser Thread hat das Gleiche erlebt und es mit nssm gelöst, um den Dienst zu installieren.
w00ngy
quelle
4
Windows scheint keine .bat-Dateien als Dienste auszuführen.
Perkins
@Perkins - Meins hat gestern an ein paar Maschinen gearbeitet. Erleben Sie etwas Bestimmtes? Ich habe einen Fehler festgestellt, dass der Dienst beim Start nicht rechtzeitig reagiert hat, aber die .bat-Datei sollte den Kibana node.js-Server starten und wurde auch mit dem Fehler erfolgreich ausgeführt. Jungs in diesem Thread schienen dasselbe zu erleben, taten es aber nicht mit nssm. stackoverflow.com/a/40130630/885535
w00ngy
2
In meinem Fall werden die Dateien, die die Batchdatei erstellen soll, nicht erstellt und die Programme werden nicht ausgeführt. Daher muss ich davon ausgehen, dass sie nicht gestartet werden. Ich habe es geschafft, dies zu umgehen, indem ich den Dienst zum Ausführen von cmd.exe / C <Batchdatei> erstellt habe. Beachten Sie, dass ich Windows 10 verwende, daher kann dies eine neue "Sicherheits" -Sache sein.
Perkins
@Perkins Ich habe es gerade auf Win10 1803 zum Laufen gebracht, kein Problem, startet meinen node.js Server. Erstellt die bat-Datei die Dateien und führt die Dienste aus, wenn sie von cmd oder Powershell aufgerufen wird? Erhalten Sie Nachrichtenboxen, wenn Sie den Dienst starten? Hat Ihr Dienst die Berechtigung für diese Verzeichnisse? Sie können eine Fehlerprotokollierung in der Fledermaus hinzufügen, indem Sie in eine lokale Protokolldatei schreiben und prüfen, ob dies funktioniert.
w00ngy
1
Get " Fehler 1053: Der Dienst hat nicht rechtzeitig auf die Start- oder Kontrollanforderung reagiert. "
Alex Klaus
5

Keine zusätzliche Software erforderlich. Verwenden Sie den Taskplaner -> Aufgabe erstellen -> ausgeblendet. Das Kontrollkästchen für versteckt befindet sich in der unteren linken Ecke. Stellen Sie die Aufgabe ein, die beim Anmelden ausgelöst werden soll (oder eine beliebige Bedingung), und wählen Sie die Aufgabe auf der Registerkarte Aktionen aus. Wenn Sie es versteckt ausführen, wird sichergestellt, dass die Aufgabe wie ein Dienst im Hintergrund ausgeführt wird.

Beachten Sie, dass Sie das Programm auch so einstellen müssen, dass es ausgeführt wird, "ob der Benutzer angemeldet ist oder nicht". Andernfalls wird das Programm weiterhin im Vordergrund ausgeführt.

Zediiiii
quelle
3

Wie Doug Currie sagt, benutze RunAsService.

Aus meiner bisherigen Erfahrung müssen Sie sich daran erinnern, dass der von Ihnen generierte Service dies auch tun wird

  • haben einen völlig anderen Satz von Umgebungsvariablen
  • müssen sorgfältig auf Rechte- / Berechtigungsprobleme überprüft werden
  • Dies kann zu Chaos führen, wenn Dialoge geöffnet werden, in denen nach Eingaben gefragt wird

Ich bin mir nicht sicher, ob der letzte noch zutrifft ... es war ein großer Albtraum in einem Projekt, an dem ich vor einiger Zeit gearbeitet habe.

Lexu
quelle
3

Obwohl es nicht kostenlos ist (aber 39 US-Dollar), hat FireDaemon für mich so gut funktioniert, dass ich es empfehlen muss. Es wird Ihre Batch-Datei ausführen, verfügt jedoch über zahlreiche zusätzliche und sehr nützliche Funktionen wie Zeitplanung, Service-Up-Überwachung, GUI- oder XML-basierte Installation von Diensten, Abhängigkeiten, Umgebungsvariablen und Protokollverwaltung.

Ich begann mit FireDaemon, um JBoss-Anwendungsserver ( run.bat ) zu starten, stellte jedoch kurz darauf fest, dass ich aufgrund der umfangreichen Konfigurationsmöglichkeiten von FireDaemon die Batchdatei löschen und die Absicht der Befehle in der FireDaemon-Dienstdefinition neu erstellen konnte.

Es gibt auch einen SUPER FireDaemon namens Trinity, den Sie sich ansehen sollten, wenn Sie über eine große Anzahl von Windows-Servern verfügen, auf denen dieser Dienst (oder technisch jeder Dienst) verwaltet werden kann.

Nikolaus
quelle
2

Unter Windows 2019 Server können Sie einen Minecraft-Java-Server mit den folgenden Befehlen ausführen:

sc create minecraft-server DisplayName = "minecraft-server" binpath = "cmd.exe /CC:\Users\Administrator\Desktop\rungui1151.lnk" type = own start = auto

Die .lnk-Datei ist eine Standard-Windows-Verknüpfung zu einer Batchdatei.

--- .bat Datei beginnt ---

java -Xmx40960M -Xms40960M -d64 -jar minecraft_server.1.15.1.jar

--- .bat Datei endet ---

All dies, weil:

Dienst weiß nicht, wie man in einem Ordner startet,

cmd.exe weiß nicht, wie man in einem Ordner startet

Das Starten des Dienstes führt zu einem "rechtzeitigen" Fehler, aber die Protokolldatei zeigt an, dass der Server ausgeführt wird.

Wenn Sie den Server herunterfahren müssen, gehen Sie einfach in den Task-Manager und suchen Sie den Server Java in Hintergrundprozessen und beenden Sie ihn oder beenden Sie den Server im Spiel mit dem Befehl / stop oder verwenden Sie für andere Programme / Server die Methoden relevant für den Server.

Goofyseeker311
quelle
Dies gibt keine Antwort auf die Frage. Sobald Sie einen ausreichenden Ruf haben, können Sie jeden Beitrag kommentieren . Geben Sie stattdessen Antworten, die nicht vom Fragesteller geklärt werden müssen . - Aus dem Rückblick
Jeremy J Starcher
1
Wenn Sie es richtig lesen, werden Sie feststellen, dass es die perfekte Antwort enthält, die für ein Beispiel relevant ist
Goofyseeker311
0

AlwaysUp führt Ihre Batchdatei problemlos als Dienst aus. Es ähnelt FireDaemon (oben erwähnt) und ist nicht kostenlos, aber Sie können feststellen, dass der umfangreiche Funktionsumfang in einer professionellen Umgebung von Vorteil ist.

Viel Glück!

CoreTech
quelle