Riavviare in automatico un servizio Windows crashato o fermo

Può capitare di dover avviare un servizio Windows che è crashato per esempio mancanza di connettività per un lungo tempo. Spesso in un ambiente complesso è difficile modificare il programma in modo che parta in autonomia dopo ripetuti tentativi così è possibile creare uno script batch per avviare un servizio e avviarlo tramite Task Scheduler (Utilità di pianificazione)

Apri l’Utilità di pianificazione: Cerca “Utilità di pianificazione” o esegui taskschd.msc.

Crea una nuova operazione: Nel pannello “Azioni”, clicca su “Crea operazione…” (non “Crea operazione di base”).

Per impostare l’utente: Nella scheda Generale, clicca sul pulsante “Cambia utente o gruppo…”.

Nella finestra che si apre, digita SYSTEM e clicca su “Controlla nomi”, poi OK.

Assicurati di spuntare la casella “Esegui con i privilegi più elevati”.

Nella scheda Attivazione, crea una nuova attivazione per definire quando lo script deve partire (es. “All’avvio” o “Ogni 5 minuti”).

Nella scheda Azioni, crea una nuova azione: “Avvio di un programma”.

Programma/script: C:\percorso\del\tuo\script.bat

Salva l’operazione.

Una volta configurata, l’operazione verrà eseguita automaticamente dall’utente SYSTEM

Ecco il codice per lanciare lo script che salva i log in un file di testo:

@echo off
SETLOCAL EnableDelayedExpansion

set "SERVICE_NAME=Mio.Service"
set "LOG_FILE=C:\percorso\del\tuo\log.log"

:: 1. Verifica se lo script è eseguito come Amministratore
net session >nul 2>&1
if %errorlevel% neq 0 (
    echo %date% %time% Errore: Eseguire lo script come Amministratore. >> "%LOG_FILE%"
    exit /b
)

:: 2. Verifica se il servizio esiste
sc query "%SERVICE_NAME%" > nul 2>&1
if !errorlevel! neq 0 (
    echo %date% %time% Il servizio "%SERVICE_NAME%" non esiste. >> "%LOG_FILE%"
) else (
    :: 3. Verifica se il servizio è già in esecuzione
    sc query "%SERVICE_NAME%" | find "STATE" | find "RUNNING" > nul
    if !errorlevel! neq 0 (
        echo %date% %time% Il servizio non e' in esecuzione. Tentativo di riavvio... >> "%LOG_FILE%"
        
        :: 4. Tenta di avviare il servizio e registra l'output (sia successo che errore) nel log
        sc start "%SERVICE_NAME%" >> "%LOG_FILE%" 2>&1
        
        :: 5. Controlla il risultato del comando di avvio
        if !errorlevel! equ 0 (
            echo %date% %time% Servizio avviato con successo. >> "%LOG_FILE%"
        ) else (
            echo %date% %time% ERRORE: Impossibile avviare il servizio. Controllare l'output precedente nel log. >> "%LOG_FILE%"
        )
    ) else (
        echo %date% %time% Il servizio e' gia' in esecuzione. >> "%LOG_FILE%"
    )
)

ENDLOCAL

Ecco i punti salienti dello script: SETLOCAL EnableDelayedExpansion rsolve il problema della mancanta esecuzione nei file batch dove il valore di %errorlevel% non viene aggiornato correttamente all’interno di blocchi if/else. Si usa !errorlevel! invece di %errorlevel%.

net session >nul 2>&1 serve a verificare se lo script ha i privilegi di amministratore. Se non li ha, scrive un errore nel log e si interrompe.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

hardware

Articolo precedente

Recensione dell’ASUS Vivobook S 14 S5406SA