Utwórz usługę Windows z pliku wykonywalnego

349

Czy istnieje jakiś szybki sposób, aby, biorąc pod uwagę plik wykonywalny, utworzyć usługę systemu Windows, która po uruchomieniu uruchamia ją?

Niemiecki Latorre
źródło
8
Oto instrukcje Microsoft dotyczące tego, jak to osiągnąć.
PiRX

Odpowiedzi:

460

Aby utworzyć usługę Windows z pliku wykonywalnego, możesz użyć sc.exe:

sc.exe create <new_service_name> binPath= "<path_to_the_service_executable>"

Musisz mieć cudzysłowy wokół rzeczywistej exeścieżki i spację po binPath=.

Więcej informacji na temat scpolecenia można znaleźć w Microsoft KB251192 .

Zauważ, że to nie będzie działać tylko dla dowolnego pliku wykonywalnego: plik wykonywalny musi być usługą Windows ( tj. Implementować ServiceMain ). Podczas rejestrowania pliku wykonywalnego innego niż usługa jako usługa, podczas próby uruchomienia usługi pojawi się następujący błąd:

Błąd 1053: Usługa nie odpowiedziała na żądanie uruchomienia lub kontroli w odpowiednim czasie.

Istnieją narzędzia, które mogą utworzyć usługę systemu Windows na podstawie dowolnych plików wykonywalnych innych niż usługi. Przykłady takich narzędzi można znaleźć w innych odpowiedziach.

Sergii Pozharov
źródło
11
(prawie na pewno) musisz uruchomić
wiersz
2
Ścieżka musi również być ścieżką w pełni kwalifikowaną - nie mogłem uruchomić usługi, używając ścieżki względnej.
RunOfTheShipe
4
spacja po binpath=tym, jak trzeba otaczać wykonywalną ścieżkę podwójnymi cudzysłowami, jest całkowicie błędna, przynajmniej dla Windows 10. cytowanie jest wymagane tylko wtedy, gdy ścieżka zawiera znaki specjalne, takie jak białe znaki. także obudowa (lowe / upper / mixed-case) nie ma znaczenia nigdzie, również w nazwach zmiennych, i displayname="my service"jest kolejnym gadżetem do przekazania w wierszu poleceń podczas tworzenia usługi, która ma być wyświetlana jako pierwszy wiersz ( Name) w services.msc.
2
binPath=
Następne
242

Użyj NSSM ( Menedżera usług bez ssania ), aby uruchomić .BAT lub dowolny plik .EXE jako usługę.

http://nssm.cc/

  • Krok 1 : Pobierz NSSM
  • Krok 2 : Zainstaluj usługę za pomocąnssm.exe install [serviceName]
  • Krok 3 : Otworzy się GUI, którego użyjesz do zlokalizowania pliku wykonywalnego
Kevin Tong
źródło
6
Najlepszy menedżer serwisu w historii. Udało mi się nawet przekonać PlexWatch do zainstalowania jako usługi przy użyciu NSSM.
Imperatywny
2
czy ten zestaw jest usługą na zawsze? przy każdym uruchomieniu systemu Windows usługa się uruchomi? także jak mogę to zrobić bez interakcji użytkownika? jakiś skrypt lub kod?
John Demetriou,
9
To jest absolutnie świetne, chciałbym zaakceptować tę odpowiedź zamiast pierwszej :-(
Niemiecki Latorre
2
Mogę uruchomić Dropbox jako usługę na serwerze. Absolutnie narzędzie nie ssące!
Barry Guvenkaya,
1
Czy plik exe musi być projektem usługi systemu Windows, aby mógł współpracować z nssm, czy może to być zwykły plik exe?, Ponieważ kiedy używam nssm start [nazwa usługi], wyświetla się komunikat o błędzie, usługa Windows nie może uruchomić się z wiersz polecenia itp.
Sanjeev
92

Rozszerzenie odpowiedzi (Kevin Tong).

Krok 1: Pobierz i rozpakuj plik nssm-2.24.zip

Krok 2: Z typu wiersza poleceń:

C:\> nssm.exe install [servicename]

otworzy GUI jak poniżej (przykład to serwer UT2003), a następnie po prostu przejrzysz go do: yourapplication.exe

wprowadź opis zdjęcia tutaj

Więcej informacji na: https://nssm.cc/usage


źródło
4
Prawidłowa składnia nssm.exe install [serviceName]. To rozwiązanie działa, ale jeśli masz aplikację GUI, nie będzie działać na Win Serever2003. Jeśli chcesz go później usunąć, użyjnssm.exe remove [youservicename]
Hammad Khan
1
Zakładam, że odniesienie do nginx wynika z tego, że jest to konkretny program, który chcesz uruchomić jako usługę? Dopóki nie zobaczyłem powyższego komentarza hmd, myślałem, że próbujesz pomóc, sugerując, że nginx jest wymaganą zależnością do zainstalowania lub coś takiego ... ale potem w GUI wygląda na to, że nie instalujesz nginx, instalujesz Unreal Tournament serwer? Wskazując tylko, że przykład jest niespójny i potencjalnie wprowadzający w błąd. Proste „Załóżmy, że chcesz zainstalować nginx jako usługę, to wyglądałoby to tak:” pomogłoby.
flutefreak7
@ flutefreak7 tak nginxnie jest konieczne i wprowadza w błąd. Polecenie będzie również działać bez niego. Jest to parametr opcjonalny, jeśli chcesz podać nazwę usługi z wiersza polecenia.
Hammad Khan,
1
Kiedy próbuję użyć nssm, mój Windows Forms jest uruchomiony, ale formularz nie jest wyświetlany ... Dlaczego?
Radenko Zec,
Uruchamia aplikację jako usługę Windows, większość z nich służy do obsługi wewnętrznej bazy danych. Możliwe też, że działa jako inna nazwa użytkownika root / admin. musisz to sprawdzić. Również więcej informacji można sprawdzić tutaj: nssm.cc/usage
16

Wiele istniejących odpowiedzi obejmuje interwencję człowieka w czasie instalacji. Może to być proces podatny na błędy. Jeśli masz wiele plików wykonywalnych, które chcesz zainstalować jako usługi, ostatnią rzeczą, którą chcesz zrobić, to zrobić je ręcznie podczas instalacji.

W ramach wyżej opisanego scenariusza stworzyłem serman , narzędzie wiersza polecenia do zainstalowania pliku wykonywalnego jako usługi. Wszystko, co musisz napisać (i napisać tylko raz), to prosty plik konfiguracyjny usługi wraz z plikiem wykonywalnym. Biegać

serman install <path_to_config_file>

zainstaluje usługę. stdouti stderrwszyscy są zalogowani. Aby uzyskać więcej informacji, zajrzyj na stronę projektu .

Działający plik konfiguracyjny jest bardzo prosty, jak pokazano poniżej. Ale ma również wiele przydatnych funkcji, takich jak <env>i <persistent_env>poniżej.

<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
źródło
9

te dodatki okazują się przydatne .. należy je wykonać jako administrator

sc create  <service_name> binpath=<binary_path>
sc stop    <service_name>
sc queryex <service_name>
sc delete  <service_name>

Jeśli w nazwie usługi znajdują się spacje, należy ująć je w „cudzysłowy”.

PodTech.io
źródło
Nie ma polecenia ZAINSTALUJ ani w moim Win Win 2003 sc.exe 5.2.3790.3959, ani w M $ F1
user6698332
1
Użyj „utwórz” zamiast „zainstaluj”. sc create <service_name> binpath= <binary_path>
CSquared,
4

Testowałem do tego dobry produkt: AlwaysUp . Nie za darmo, ale mają 30-dniowy okres próbny, więc możesz spróbować ...

A. Masson
źródło