Czy istnieje jakiś szybki sposób, aby, biorąc pod uwagę plik wykonywalny, utworzyć usługę systemu Windows, która po uruchomieniu uruchamia ją?
Czy istnieje jakiś szybki sposób, aby, biorąc pod uwagę plik wykonywalny, utworzyć usługę systemu Windows, która po uruchomieniu uruchamia ją?
Odpowiedzi:
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 sc
polecenia 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.
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
.
binPath=
Użyj NSSM ( Menedżera usług bez ssania ), aby uruchomić .BAT lub dowolny plik .EXE jako usługę.
nssm.exe install [serviceName]
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
Więcej informacji na: https://nssm.cc/usage
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]
nginx
nie 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.
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ę. stdout
i stderr
wszyscy 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>
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”.
sc create <service_name> binpath= <binary_path>