Zatrzymać i uruchomić usługę za pomocą pliku wsadowego lub cmd?

288

Jak mogę napisać skrypt bat lub cmd, aby niezawodnie zatrzymać i uruchomić usługę z kontrolą błędów (lub dać mi znać, że z jakiegokolwiek powodu nie powiodła się)?

Keng
źródło
Może nieco nie na temat (ponieważ pytasz o instrukcje bat i cmd), ale: PowerShell daje ci wiele kontroli i informacji zwrotnych za robienie takich działań.
GvS

Odpowiedzi:

347

Użyj polecenia SC(kontrola usługi), daje o wiele więcej opcji niż tylko start& stop.

  OPIS:
          SC to program wiersza poleceń służący do komunikacji z
          NT Service Controller i usługi.
  STOSOWANIE:
      sc <serwer> [polecenie] [nazwa usługi] ...

      Opcja <serwer> ma postać „\\ NazwaSerwera”
      Dalszą pomoc dotyczącą poleceń można uzyskać, pisząc: „sc [polecenie]”
      Polecenia:
        zapytanie ----------- Pyta o status usługi lub
                        wylicza status dla rodzajów usług.
        queryex --------- Pyta o status rozszerzony dla usługi lub
                        wylicza status dla rodzajów usług.
        start ----------- Uruchamia usługę.
        pauza ----------- Wysyła żądanie PAUZY do usługi.
        interrogate ----- Wysyła zapytanie sterujące INTERROGATE do usługi.
        kontynuuj -------- Wysyła żądanie sterowania KONTYNUUJ do usługi.
        stop ------------ Wysyła żądanie STOP do usługi.
        config ---------- Zmienia konfigurację usługi (trwałą).
        opis ----- Zmienia opis usługi.
        awaria --------- Zmienia działania podejmowane przez usługę w przypadku awarii.
        qc -------------- Pyta o informacje dotyczące konfiguracji usługi.
        qdescription ---- Odpytuje o opis usługi.
        qfailure -------- Sprawdza działania podjęte przez usługę w przypadku awarii.
        usuń ---------- Usuwa usługę (z rejestru).
        Utwórz ---------- Tworzy usługę. (dodaje go do rejestru).
        kontrola --------- Wysyła kontrolę do usługi.
        sdshow ---------- Wyświetla deskryptor bezpieczeństwa usługi.
        sdset ----------- Ustawia deskryptor bezpieczeństwa usługi.
        GetDisplayName - Pobiera DisplayName dla usługi.
        GetKeyName ------ Pobiera ServiceKeyName dla usługi.
        EnumDepend ------ Wylicza zależności serwisowe.

      Następujące polecenia nie wymagają nazwy usługi:
      sc <server> <command> <option>
        boot ------------ (ok | bad) Wskazuje, czy powinien wystartować ostatni boot
                        zostać zapisany jako ostatnia znana dobra konfiguracja rozruchowa
        Zablokuj ------------ Blokuje bazę danych usług
        QueryLock ------- Pyta LockStatus o bazę danych SCManager
  PRZYKŁAD:
          sc uruchom MyService
Ferruccio
źródło
1
Zgadzam się, że jest to lepsze niż start / stop netto. Należy pamiętać, że istnieje również możliwość dotknięcia usług na zdalnych komputerach.
Outlaw Programmer
1
Świetna odpowiedź. Ale musisz być administratorem, aby uruchomić „SC start service”. Znalazłem rozwiązanie, które tutaj (odpowiedź Zaakceptowany zawiera rozwiązanie).
Michael K.
56
Problem z SC polega na tym, że polecenie powraca natychmiast, a nie po zakończeniu akcji. Jeśli chcesz zrestartować usługę za pomocą pliku wsadowego (zatrzymaj, a następnie uruchom), zatrzymanie natychmiast wraca, uruchomienie następnie kończy się niepowodzeniem, ponieważ usługa nie została zatrzymana. Net stop / start powraca po zakończeniu akcji, więc nie ma tego problemu.
Dom
Otworzyłem cmd jako tryb administratora, pojawia się błąd Składnia tego polecenia jest następująca: Usługa NET STOP
Satish Singh
czy istnieje sposób, aby sprawdzić, czy usługa została poprawnie zatrzymana? w 2020 roku?
Anand Varkey Philips
212
net start [serviceName]

i

net stop [serviceName]

powiedzą ci, czy udało im się całkiem dobrze. Na przykład

U:\>net stop alerter
The Alerter service is not started.

More help is available by typing NET HELPMSG 3521.

W przypadku uruchamiania z pliku wsadowego masz dostęp do ERRORLEVEL kodu powrotu. 0 oznacza sukces. Coś wyższego wskazuje na niepowodzenie.

Jako plik nietoperza error.bat:

@echo off
net stop alerter
if ERRORLEVEL 1 goto error
exit
:error
echo There was a problem
pause

Dane wyjściowe wyglądają następująco:

U:\>error.bat
The Alerter service is not started.

More help is available by typing NET HELPMSG 3521.

There was a problem
Press any key to continue . . .

Kody zwrotne

 - 0 = Success
 - 1 = Not Supported
 - 2 = Access Denied
 - 3 = Dependent Services Running
 - 4 = Invalid Service Control
 - 5 = Service Cannot Accept Control
 - 6 = Service Not Active
 - 7 = Service Request Timeout
 - 8 = Unknown Failure
 - 9 = Path Not Found
 - 10 = Service Already Running
 - 11 = Service Database Locked
 - 12 = Service Dependency Deleted
 - 13 = Service Dependency Failure
 - 14 = Service Disabled
 - 15 = Service Logon Failure
 - 16 = Service Marked For Deletion
 - 17 = Service No Thread
 - 18 = Status Circular Dependency
 - 19 = Status Duplicate Name
 - 20 = Status Invalid Name
 - 21 = Status Invalid Parameter 
 - 22 = Status Invalid Service Account
 - 23 = Status Service Exists
 - 24 = Service Already Paused

Edytuj 20.04.2015

Kody zwrotne:

Polecenie NET nie zwraca udokumentowanych kodów powrotu klasy Win32_Service (usługa nieaktywna, limit czasu żądania usługi itp.) I dla wielu błędów po prostu zwróci poziom błędu 2.

Zajrzyj tutaj: http://ss64.com/nt/net_service.html

Bill Michell
źródło
1
NET nie jest tylko dla funkcji usługowych związanych podczas gdy SC jest tylko dla funkcji usługowych związanych.
Wernight
3
Ta odpowiedź jest lepsza, ponieważ polecenia „net” blokują się i czekają na uruchomienie lub zatrzymanie usługi przed kontynuowaniem wykonywania skryptu wsadowego.
Steven
Ponieważ (jak mówi Edycja) przez większość czasu errorlevelzwracane jest 2, zobacz tutaj, jak interpretować wynik błędu .
HeyJude
28

Możesz użyć polecenia NET START, a następnie sprawdzić zmienną środowiskową ERRORLEVEL, np

net start [your service]
if %errorlevel% == 2 echo Could not start service.
if %errorlevel% == 0 echo Service started successfully.
echo Errorlevel: %errorlevel%

Oświadczenie: Napisałem to z góry głowy, ale myślę, że to zadziała.

Jonas Gulle
źródło
8

Zamiast sprawdzania kodów, to też działa

net start "Apache tomcat" || goto ExitError

:End  
exit 0  

:ExitError  
echo An error has occurred while starting the tomcat services  
exit 1  
vanval
źródło
7

Stworzyłem do tego mój osobisty plik wsadowy, mój jest nieco inny, ale możesz go modyfikować według własnego uznania. Stworzyłem to jakiś czas temu, ponieważ byłem znudzony i chciałem w prosty sposób umożliwić ludziom wprowadzanie zakończenia, startu, zatrzymania lub ustawienia auto. Ten plik BAT wymaga jedynie podania nazwy usługi, a resztę zrobi za Ciebie. Nie zdawałem sobie sprawy, że szuka czegoś, co wskazywałoby na jakiś błąd, musiałem źle odczytać tę część. Chociaż zazwyczaj można to zrobić, wprowadzając >> output.txt na końcu wiersza.

% Var% to tylko sposób, w jaki użytkownik może wprowadzić w tym celu swoją własną usługę, zamiast modyfikować plik nietoperza za każdym razem, gdy chcesz uruchomić / zatrzymać inną usługę.

Jeśli się mylę, każdy może mnie poprawić.

@echo off
set /p c= Would you like to start a service [Y/N]?
  if /I "%c%" EQU "Y" goto :1
  if /I "%c%" EQU "N" goto :2
    :1  
    set /p var= Service name: 
:2 
set /p c= Would you like to stop a service [Y/N]?
  if /I "%c%" EQU "Y" goto :3
  if /I "%c%" EQU "N" goto :4
    :3  
    set /p var1= Service name:
:4
set /p c= Would you like to disable a service [Y/N]?
  if /I "%c%" EQU "Y" goto :5
  if /I "%c%" EQU "N" goto :6
    :5  
    set /p var2= Service name:
:6 
set /p c= Would you like to set a service to auto [Y/N]?
  if /I "%c%" EQU "Y" goto :7
  if /I "%c%" EQU "N" goto :10
    :7  
    set /p var3= Service name:
:10
sc start %var%
sc stop %var1%
sc config %var2% start=disabled
sc config %var3% start=auto
Nathanial Wilson
źródło
1
Zazwyczaj odpowiedzi tylko w kodzie nie są doceniane. Czy mógłbyś rozwinąć swoje rozwiązanie lub dodać kilka wyjaśnień?
skorek
2
Stworzyłem to jakiś czas temu, ponieważ byłem znudzony i chciałem w prosty sposób umożliwić ludziom wprowadzanie zakończenia, startu, zatrzymania lub ustawienia auto. Ten plik BAT wymaga jedynie podania nazwy usługi, a resztę zrobi za Ciebie.
Nathanial Wilson
6

Korzystanie z kody powrotne net starti net stopwydaje się, że najlepszym sposobem dla mnie. Spójrz na to: kody powrotu Net Start .

ZombieSheep
źródło
2
Połączona strona już nie istnieje. W związku z tym jest to teraz bardziej komentarz.
Neolisk,
5

Składnia zawsze mnie dopada .... więc ...

Oto wyraźnie, jak dodać wiersz do pliku wsadowego, który zabije usługę zdalną (na innym komputerze), jeśli jesteś administratorem na obu komputerach, uruchom .bat jako administrator, a maszyny są w tej samej domenie. Nazwa komputera jest zgodna z formatem UNC \ mój serwer

sc \\ip.ip.ip.ip stop p4_1

W tym przypadku ... p4_1 była zarówno nazwą usługi, jak i nazwą wyświetlaną, podczas przeglądania właściwości usługi w programie Service Manager. Musisz użyć nazwy usługi.

Dla ćpunów Ops Service ... pamiętaj, aby dołączyć kod przyczyny i komentarz! tzn. „4”, co równa się „Planowane” i komentarz „Zatrzymywanie serwera w celu konserwacji”

sc \\ip.ip.ip.ip stop p4_1 4 Stopping server for maintenance
ATSiem
źródło
1
Jak to zrobić, jeśli muszę zalogować się przy użyciu innego identyfikatora użytkownika i hasła?
Frantumn
1
Uruchomisz CMDjako drugi użytkownik / identyfikator, a runas /user:Domain\UserName cmdnastępnie wprowadź hasło. CMD zacznie działać jako określone konto użytkownika.
user4317867
4

Chcielibyśmy myśleć, że „net stop” zatrzyma usługę. Niestety rzeczywistość nie jest tak czarno-biała. Jeśli zatrzymanie usługi zajmuje dużo czasu, polecenie powróci przed zatrzymaniem usługi. Nie będziesz jednak wiedział, chyba że sprawdzisz poziom błędu.

Wydaje się, że rozwiązaniem jest pętla w poszukiwaniu stanu usługi aż do jej zatrzymania, z przerwą za każdym razem w pętli.

Ale potem znowu...

Widzę, że pierwsza usługa zajmuje dużo czasu, aby się zatrzymać, a potem „netto stop” dla kolejnej usługi po prostu wydaje się nic nie robić. Spójrz na usługę w menedżerze usług, a jej stan jest nadal „Uruchomiony” - bez zmiany na „Zatrzymanie”. Jednak mogę zatrzymać tę drugą usługę ręcznie za pomocą SCM i zatrzymuje się ona za 3 lub 4 sekundy.

DaveH
źródło
3

lub możesz uruchomić usługę zdalną za pomocą tego polecenia cmd: sc \\<computer> start <service>

cebula
źródło
3

Właśnie użyłem powyższego przykładu Jonasa i stworzyłem pełną listę poziomów błędu od 0 do 24. Inne posty są poprawne net starti net stopużywaj tylko errorlevel0 dla sukcesu i 2 dla niepowodzenia.

Ale to działało dla mnie:

net stop postgresql-9.1
if %errorlevel% == 2 echo Access Denied - Could not stop service
if %errorlevel% == 0 echo Service stopped successfully
echo Errorlevel: %errorlevel%

Zmiana stopdo starti działa w odwrotnym kierunku.

Clinton
źródło
3

Ręczne ponowne uruchomienie usługi jest w porządku - services.msc ma przycisk „Uruchom ponownie”, ale w wierszu poleceń zarówno polecenia sc, jak i net nie mają przełącznika „restart”, a jeśli ponowne uruchomienie zaplanowano w pliku cmd / bat, usługa jest zatrzymywana i uruchamiana natychmiast, czasami pojawia się błąd, ponieważ usługa nie została jeszcze zatrzymana, potrzeba czasu, aby ją zamknąć.

Może to generować błąd: sc stop sc start

Dobrym pomysłem jest wstawienie limitu czasu, używam polecenia ping (pinguje co 1 sekundę): sc stop ping localhost -n 60 sc start

Kuleris
źródło
2

Oto polecenie systemu Windows 10, aby uruchomić Przywracanie systemu za pomocą partii:

sc config swprv start= Auto

Możesz także polubić te polecenia:

  • Zmień wartość rejestru na automatyczne uruchamianie Przywracanie systemu

    REG ADD „HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ SystemRestore” / v Wyłącz SR / t REG_DWORD / d 0 / f

  • Utwórz punkt przywracania systemu

    Wmic.exe / Namespace: \ root \ default Path SystemRestore Wywołanie CreateRestorePoint „djibe save your PC”, 100, 12

  • Zmień użycie dysku Przywracania systemu

    vssadmin zmień rozmiar shadowstorage / for = C: / on = C: / maxsize = 10%

Cieszyć się

djibe
źródło
1

SC może zrobić wszystko z usługami ... uruchamiać, zatrzymywać, sprawdzać, konfigurować i więcej ...

Axeman
źródło
1

Czasami okazuje się, że przystanek nie działa ..

Mój SQlServer czasami to robi. Użycie następującego wiersza poleceń zabija go. Jeśli naprawdę potrzebujesz skryptu, aby zabijać rzeczy, które się nie kończą. Chciałbym to zrobić w ostateczności

taskkill /pid [pid number] /f
Andrzej Pasztet
źródło
0

Piszę usługę systemu Windows w języku C #, pętla stop / uninstall / build / install / start stała się zbyt męcząca. Napisałem mini skrypt, nazwał go reploy.bati upuściłem w moim katalogu wyjściowym Visual Studio (takim, który ma wbudowany plik wykonywalny usługi), aby zautomatyzować pętlę.

Po prostu ustaw te 3 zmienne

servicename : pojawia się w panelu sterowania usługi Windows (services.msc)

slndir : folder (nie pełna ścieżka) zawierający plik rozwiązania (.sln)

binpath : pełna ścieżka (nie ścieżka folderu) do pliku wykonywalnego usługi z kompilacji

UWAGA: Aby polecenie działało, należy je uruchomić z wiersza polecenia programu Visual Studio Developer msbuild.

SET servicename="My Amazing Service"
SET slndir="C:dir\that\contains\sln\file"
SET binpath="C:path\to\service.exe"
SET currdir=%cd%

call net stop %servicename%
call sc delete %servicename%
cd %slndir%
call msbuild 
cd %bindir%
call sc create %servicename% binpath=%binpath%
call net start %servicename%
cd %currdir%

Może to komuś pomaga :)

sh87
źródło