W środowiskach produkcyjnych stabilność usług systemowych jest kluczowa. Awaria usługi może prowadzić do przestojów, błędów aplikacji lub utraty danych. PowerShell oferuje wiele sposobów na automatyzację reakcji na takie sytuacje – od prostych restartów po zaawansowane monitorowanie.
1. Ustawienia odzyskiwania usługi (Recovery Options)
Windows pozwala skonfigurować automatyczne działania po awarii usługi (np. restart) w zakładce „Odzyskiwanie” w konsoli usług. PowerShell nie ma natywnego cmdletu do zarządzania tymi ustawieniami, ale można użyć sc.exe:
sc.exe failure "Spooler" reset= 86400 actions= restart/60000/restart/60000/""/60000
reset= 86400– reset licznika awarii po 1 dniu (86400 sekund)actions=– kolejno: restart po 60 sek., restart po 60 sek., brak działania po 60 sek.
Można to zautomatyzować za pomocą funkcji PowerShell:
function Set-ServiceRecovery {
param (
[string]$ServiceName,
[int]$ResetTime = 86400,
[string]$Actions = "restart/60000/restart/60000/""/60000"
)
sc.exe failure $ServiceName reset= $ResetTime actions= $Actions
}
Set-ServiceRecovery -ServiceName "Spooler"
2. Monitorowanie cykliczne – skrypt PowerShell
Możesz stworzyć prosty skrypt, który cyklicznie sprawdza stan usługi i restartuje ją, jeśli jest zatrzymana:
$serviceName = "Spooler"
$service = Get-Service -Name $serviceName
if ($service.Status -ne "Running") {
Restart-Service -Name $serviceName -Force
}
Taki skrypt można uruchamiać co kilka minut przez Harmonogram zadań Windows.
3. Harmonogram zadań + dziennik zdarzeń
Możesz utworzyć zadanie, które reaguje na konkretne zdarzenie w dzienniku systemowym, np. Event ID 7031 (awaria usługi). Harmonogram może uruchamiać skrypt PowerShell w odpowiedzi na to zdarzenie.
4. WMI + PowerShell – reakcja na zmianę stanu
Za pomocą WMI (Windows Management Instrumentation) możesz nasłuchiwać zmian stanu usług, reagując niemal natychmiast, gdy tylko usługa przestanie działać:
Register-WmiEvent -Query "SELECT * FROM __InstanceModificationEvent WITHIN 10 WHERE TargetInstance ISA 'Win32_Service' AND TargetInstance.State != 'Running'" -Action {
Restart-Service -Name $Event.SourceEventArgs.NewEvent.TargetInstance.Name
}
5. Watchdog w tle – własny serwis monitorujący
Możesz stworzyć własny „watchdog” – skrypt działający w tle, który monitoruje usługę i reaguje na jej awarię. Poniżej przykład prostego skryptu:
Przykład: Watchdog monitorujący usługę „Spooler”
# Watchdog.ps1 – prosty monitoring usługi
$ServiceName = "Spooler"
$LogPath = "C:\Logs\watchdog.log"
function Log {
param ($msg)
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
Add-Content -Path $LogPath -Value "$timestamp - $msg"
}
while ($true) {
try {
$service = Get-Service -Name $ServiceName
if ($service.Status -ne "Running") {
Log "Usługa '$ServiceName' nie działa. Próba restartu..."
Restart-Service -Name $ServiceName -Force
Log "Usługa '$ServiceName' została zrestartowana."
} else {
Log "Usługa '$ServiceName' działa poprawnie."
}
} catch {
Log "Błąd: $_"
}
Start-Sleep -Seconds 60
}
Jak uruchomić jako usługę:
- Użyj narzędzia NSSM – Non-Sucking Service Manager (
https://nssm.cc/) do uruchomienia skryptu jako usługi Windows. - Skrypt będzie działał w tle i logował działania do pliku.
6. Rozwiązania korporacyjne
W większych środowiskach warto rozważyć dedykowane, komercyjne platformy:
- System Center Operations Manager (SCOM) – zaawansowane monitorowanie i automatyczne akcje.
- Intune + PowerShell scripts – w środowiskach zarządzanych przez Microsoft Endpoint Manager.
- Zabbix/Nagios – zewnętrzne monitorowanie z akcjami naprawczymi (często zintegrowane z własnymi skryptami).
Brak komentarzy:
Prześlij komentarz