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.