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ę)?
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ę)?
Odpowiedzi:
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
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
NET
nie jest tylko dla funkcji usługowych związanych podczas gdy SC
jest tylko dla funkcji usługowych związanych.
errorlevel
zwracane jest 2, zobacz tutaj, jak interpretować wynik błędu .
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.
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
Korzystanie z kody powrotne net start
i net stop
wydaje się, że najlepszym sposobem dla mnie. Spójrz na to: kody powrotu Net Start .
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
CMD
jako drugi użytkownik / identyfikator, a runas /user:Domain\UserName cmd
następnie wprowadź hasło. CMD zacznie działać jako określone konto użytkownika.
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.
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 start
i net stop
używaj tylko errorlevel
0 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 stop
do start
i działa w odwrotnym kierunku.
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
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ę
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
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.bat
i 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 :)