Uruchom plik wsadowy jako usługę systemu Windows

159

Aby uruchomić jedną aplikację, należy uruchomić plik wsadowy (który wykonuje takie czynności, jak uruchamianie Jetty, wyświetlanie dzienników na żywo itp.). Aplikacja będzie działać tylko wtedy, gdy ten plik wsadowy jest uruchomiony. Dlatego jestem zmuszony uruchomić ten plik wsadowy i nie wylogowywać się z serwera Windows.

Czy ten plik wsadowy można uruchomić jako usługę? Eksperymentuję z jedną z sugestii z podobnego pytania .

publicRavi
źródło
27
Programowanie wsadowe jest tematem dla wymiany stosów.
Harry Johnston,
12
Dobre pytanie. +1. Moderatorzy są zbyt źli ... Mam też inną dobrą odpowiedź, ale pytanie zamknięte ((
gavenkoa
Zamiast tego używam tego RunAsService: runasservice.com . Jest dużo, dużo prostszy w użyciu. Żadnych bzdur z konfiguracją XML. Zasadniczo daje to plik wykonywalny RunAsService.exe, który opakowuje dowolną aplikację konsoli argumentami wiersza poleceń jako usługę. Używam tego do uruchamiania skryptów bash Cygwin jako usług !!! Niestety, to proste narzędzie wydaje się mieć zamknięte źródło.
Kaz
8
nominowanie do ponownego otwarcia na podstawie „narzędzi oprogramowania powszechnie używanych przez programistów”. Jaka jest zdecydowanie odpowiedź na to pytanie. Pamiętaj też, że jest to pierwszy wynik Google podczas wyszukiwania hasła „plik wsadowy uruchamiania systemu Windows jako usługa”, więc niezależnie od tego, czy w wąskim zakresie jest to kwestia „na temat”, reszta świata myśli, że tak jest. Głosuję tutaj za pragmatyzmem zamiast dogmatyzmem.
Adam Cameron,
Podobne pytanie można znaleźć pod adresem serverfault serverfault.com/questions/54676/ ...
Stephen Quan

Odpowiedzi:

151

NSSM jest całkowicie darmowy i niezwykle łatwy, uruchamia wiersz poleceń / terminal jako administrator:

nssm install "YourCoolServiceNameLabel"

pojawi się okno dialogowe, w którym możesz wybrać, gdzie jest plik, który chcesz uruchomić.

odinstalować

nssm remove "YourCoolServiceNameLabel"
Junior Mayhé
źródło
25
+1 Nigdy o tym nie słyszałem, ale jest bardzo ładny. NSSM rzeczywiście nie jest do niczego!
Byron Whitlock
1
zajęło mi 2 minuty, aby zainstalować usługę
Ben Wilde
3
@Junior M Thanks !! Uratowałeś mnie. Spędziłem na to 4 godziny. Dzięki!!
verystrongjoe
2
Czy wiesz, czy istnieje sposób na podanie nssmwszystkich niezbędnych argumentów na wejściu, aby uniknąć wprowadzania danych w wyskakującym okienku - próbuję zautomatyzować ten proces?
amfibia
1
NSSM jest ciągle usuwany u niektórych naszych klientów przez program antywirusowy GDATA. Tak, wiem, białe listy ... ale klienci nie robią tego, co jest dla nich dobre. To smutna prawda.
Prezes Dreamspace
61

Dlaczego po prostu nie skonfigurować go jako zaplanowanego zadania, które ma być uruchamiane przy uruchomieniu?

Stephen Martin
źródło
1
Mam wiele plików wsadowych wykonujących kopie zapasowe za pośrednictwem robocopy, które uruchamiam za pośrednictwem zaplanowanych zadań (przejdź do Panelu sterowania, Zaplanowane zadania) uruchomionych na serwerze z systemem Win 2003. Działa niewiarygodnie ...
SAL
Zrobiliśmy to za pomocą skryptu, którego używaliśmy do monitorowania naszej usługi tworzenia kopii zapasowych. To działa jak urok.
music2myear
1
to najlepsze rozwiązanie imo. nie jest wymagane żadne oprogramowanie innych firm ani interfejs wiersza poleceń. Plus Task Scheduler zapewnia wiele opcji wyzwalaczy, warunki itd
dev
3
Działa teraz, gdy się zorientowałem: Kiedy zadanie jest uruchamiane podczas uruchamiania (z „Uruchom, niezależnie od tego, czy użytkownik jest zalogowany”)% UserProfile% to C: \ Users \ Default \ Innym razem będzie to oczekiwane C: \ Users \ ExpectedUser \ Może to spowodować tajemnicze awarie niektórych plików .bat, które wydają się działać dobrze w innych zaplanowanych zadaniach.
user1754036
2
Zaplanowane zadania są notorycznie zawodne - właściwie natknąłem się na to pytanie z powodu wszystkich problemów, które miałem z zadaniami, które nie były uruchamiane na czas bez wyraźnego powodu.
22

Do tego celu służy wbudowane cmd systemu Windows: sc create . Nie tak wyszukane jak nssm, ale nie musisz pobierać dodatkowego oprogramowania.

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

Uwaga

  • start = demand oznacza, że ​​musisz sam uruchomić usługę
  • spacja jest wymagana po =
  • Wystąpił błąd podczas uruchamiania usługi, że usługa nie odpowiedziała w odpowiednim czasie, ale było jasne, że usługa pomyślnie uruchomiła plik .bat. Nie zagłębiłem się jeszcze w to, ale ten wątek doświadczył tego samego i rozwiązał to za pomocą nssm do zainstalowania usługi.
w00ngy
źródło
4
Wygląda na to, że system Windows nie uruchamia plików .bat jako usług.
Perkins,
@Perkins - Mój pracował wczoraj na kilku maszynach. Czy przeżywasz coś konkretnego? Napotkałem błąd, że usługa nie odpowiedziała na czas przy starcie, ale plik .bat miał uruchamiać serwer Kibana node.js i działał pomyślnie, nawet z błędem. Faceci w tym wątku zdawali się doświadczać tego samego, ale nie mieli tego w przypadku nssm. stackoverflow.com/a/40130630/885535
w00ngy
2
W moim przypadku pliki, które ma utworzyć plik wsadowy, nie są tworzone, a programy nie działają, więc muszę założyć, że go nie uruchamia. Udało mi się to obejść, tworząc zamiast tego usługę uruchamiającą cmd.exe / C <batchfile>. Zwróć uwagę, że używam Windows 10, więc może to być nowa kwestia „bezpieczeństwa”.
Perkins
@Perkins Właśnie uruchomiłem go na win10 1803, nie ma problemu, uruchamiam mój serwer node.js. Czy plik bat tworzy pliki i uruchamia usługi, gdy są wywoływane z cmd lub PowerShell? Czy otrzymujesz jakieś pola wiadomości, kiedy idziesz uruchomić usługę? Czy Twoja usługa ma uprawnienia do tych katalogów? Możesz dodać błąd podczas logowania w bat, pisząc do lokalnego pliku dziennika, sprawdź, czy to działa.
w00ngy
1
Otrzymuje komunikat „ Błąd 1053: Usługa nie odpowiedziała na żądanie uruchomienia lub sterowania w odpowiednim czasie.
Alex Klaus
5

Nie ma potrzeby dodatkowego oprogramowania. Użyj harmonogramu zadań -> utwórz zadanie -> ukryte. Pole wyboru ukrywania znajduje się w lewym dolnym rogu. Ustaw zadanie, które ma być uruchamiane przy logowaniu (lub w jakimkolwiek innym stanie) i wybierz zadanie na karcie Akcje. Uruchamianie go w ukryciu zapewnia ciche działanie zadania w tle, podobnie jak usługa.

Zauważ, że musisz także ustawić program tak, aby działał „niezależnie od tego, czy użytkownik jest zalogowany, czy nie”, w przeciwnym razie program będzie nadal działał na pierwszym planie.

Zediiiii
źródło
3

Jak mówi Doug Currie, użyj RunAsService.

Z mojego wcześniejszego doświadczenia musisz pamiętać, że usługa, którą generujesz, będzie

  • mają zupełnie inny zestaw zmiennych środowiskowych
  • muszą być dokładnie sprawdzane pod kątem problemów z prawami / pozwoleniami
  • może spowodować spustoszenie, jeśli otworzy okna dialogowe z prośbą o jakiekolwiek dane wejściowe

nie jestem pewien, czy ostatnia nadal obowiązuje ... to była jedna wielka nocna klacz w projekcie, nad którym pracowałem jakiś czas temu.

lexu
źródło
3

Chociaż nie jest darmowy (ale 39 USD), FireDaemon działał dla mnie tak dobrze, że muszę go polecić. Uruchomi plik wsadowy, ale ma mnóstwo dodatkowych i bardzo przydatnych funkcji, takich jak planowanie, monitorowanie serwisowania, instalacja usług oparta na GUI lub XML, zależności, zmienne środowiskowe i zarządzanie dziennikami.

Zacząłem używać FireDaemon do uruchamiania serwerów aplikacji JBoss ( run.bat ), ale wkrótce potem zdałem sobie sprawę, że bogactwo możliwości konfiguracyjnych FireDaemon pozwoliło mi porzucić plik wsadowy i odtworzyć intencję jego poleceń w definicji usługi FireDaemon.

Istnieje również SUPER FireDaemon o nazwie Trinity, na który możesz chcieć spojrzeć, jeśli masz dużą liczbę serwerów Windows, na których zarządzasz tą usługą (lub technicznie każdą usługą).

Mikołaja
źródło
2

W systemie Windows 2019 Server możesz uruchomić serwer Java Minecraft za pomocą następujących poleceń:

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

Plik .lnk to standardowy skrót systemu Windows do pliku wsadowego.

--- Rozpoczyna się plik .bat ---

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

--- .bat kończy się plik ---

Wszystko to dlatego, że:

usługa nie wie, jak uruchomić się w folderze,

cmd.exe nie wie, jak uruchomić w folderze

Uruchomienie usługi spowoduje błąd „w odpowiednim czasie”, ale plik dziennika ujawnia, że ​​serwer działa.

Jeśli chcesz wyłączyć serwer, po prostu przejdź do menedżera zadań i znajdź serwer java w procesach w tle i zakończ go lub zamknij serwer z gry za pomocą polecenia / stop lub dla innych programów / serwerów użyj metod odpowiednie dla serwera.

Goofyseeker311
źródło
To nie daje odpowiedzi na pytanie. Gdy zdobędziesz wystarczającą reputację , będziesz mógł komentować każdy post ; zamiast tego udziel odpowiedzi, które nie wymagają wyjaśnień od pytającego . - Z recenzji
Jeremy J Starcher,
1
jeśli dobrze go przeczytasz, zauważysz, że zawiera doskonałą odpowiedź, odpowiednią dla przykładu
Goofyseeker311
0

AlwaysUp z łatwością uruchomi twój plik wsadowy jako usługę. Jest podobny do FireDaemon (wspomnianego powyżej) i nie jest darmowy, ale bogaty zestaw funkcji może okazać się atutem w środowisku zawodowym.

Powodzenia!

CoreTech
źródło