Ostatnio jedna z usług “działających w tle” na moim komputerze zaczęła szwankować, prawdopodobnie ze względu na to, że najczęściej korzystam z hibernacji zamiast zamykać system (wygoda i czas), i podczas wzbudzania coś się dziej z nią niedobrego, i przestaje działać, a przyznam, że nie mam czasu ani ochoty sprawdzać, czy na pewno działa – ma działać automatycznie w tle i tyle…

Dlatego postanowiłem przygotować mały skrypt (zwykły BAT/CMD) uruchamiany “raz na jakiś czas” za pomocą systemowego harmonogramu zadań, który ma m.in. sprawdzić czy usługa działa, w i razie konieczności ją ponownie uruchomić (zrestartować).

Kontrola stanu usługi w systemie Windows

Skrypt zaczyna swoją pracę od wywołania funkcji sprawdzającej za pomocą komendy “sc”  status monitorowanej usługi (RUNNING), i jeśli kod błędu będzie równy 1 (usługa prawdopodobnie nie działa), w tym momencie wywoływana jest funkcja odpowiedzialna za ponowne włączenie usługi:

:CzyUslugaOK
    sc query JakasUslugaService | Find "RUNNING"
        if %errorlevel% == 1 call:StartUslugi
GOTO:EOF

:StartUslugi
    net stop JakasUslugaService
    net start JakasUslugaService
    if %errorlevel% == 2 call:StartUslugi
    if %errorlevel% == 0 timeout 5
    if %errorlevel% == 0 start "JakasUsluga" "C:\(...)\JakasUslugaTray.exe"
    if %errorlevel% == 0 exit
GOTO:EOF

call:CzyUslugaOK

Choć powyżej to wersja przygotowana na potrzeby tego wpisu, bo u mnie działa to w połączeniu z jeszcze jedną funkcją, która sprawdza czy dostępny jest określony zasób dyskowy:

:CzyDyskOK
@IF EXIST "x:\status.txt" (
    call:CzyUslugaOK
) ELSE (
    timeout 60
    call:CzyDyskOK
)
GOTO:EOF

CzyUslugaOK
    sc query JakasUslugaService | Find "RUNNING"
        if %errorlevel% == 1 call:StartUslugi
GOTO:EOF

StartUslugi
    net stop JakasUslugaService
    net start JakasUslugaService
    if %errorlevel% == 2 call:StartUslugi
    if %errorlevel% == 0 timeout 5
    if %errorlevel% == 0 start "JakasUsluga" "C:\(...)\JakasUslugaTray.exe"
    if %errorlevel% == 0 exit
GOTO:EOF

call:CzyDyskOK

Po prostu usługa obecnie ma wyłączony automatyczne uruchamianie wraz z systemem – i tak zawodziło, a dodatkowo pierwsze uruchomienie powinno mieć miejsce dopiero po podłączeniu i odblokowaniu dodatkowego dysku.

Dlatego najpierw skrypt sprawdza czy na określonym dysku znajduje się kontrolny plik “status.txt” – jeśli go nie ma, daje mi (kolejne) 60 sekund czasu na podłączenie, i dopiero gdy wykryje zdefiniowany plik przystępuje do uruchomiania usługi.

(!) Zgłoś błąd na stronie | Lub postaw nam kawę :-)
LUTy dla D-Cinelike (DJI Mini 3 Pro, DJI Avata, OSMO Pocket) od MiniFly
Wdrożenie Omnibusa w sklepie na WooCommerce
Jak (legalnie) latać dronem w Kategorii Otwartej
Patryk