Bir servisin gece yarısı durması ve sabah kullanıcı şikayetiyle fark edilmesi, önlenebilir bir senaryodur. PowerShell tabanlı izleme ve otomatik kurtarma, bu tür kesintilerin çoğunu görünmez şekilde çözer.
Basit Servis Kontrolü
$kritikServisler = @("W3SVC", "MSSQLSERVER", "Spooler")
foreach ($servis in $kritikServisler) {
$durum = Get-Service -Name $servis -ErrorAction SilentlyContinue
if ($durum.Status -ne "Running") {
Write-Host "$servis çalışmıyor! Yeniden başlatılıyor..." -ForegroundColor Red
Start-Service -Name $servis
}
}
Daha Güvenli Yaklaşım: Windows’un Kendi Kurtarma Mekanizması
Aslında birçok durumda, PowerShell scripti yazmadan önce Windows’un yerleşik servis kurtarma özelliğini kullanmak daha sağlam bir ilk savunma hattıdır:
sc.exe failure W3SVC reset= 86400 actions= restart/60000/restart/60000/restart/60000
Bu komut, servis çöktüğünde Windows’un otomatik olarak 3 kez yeniden başlatmayı denemesini sağlar. PowerShell script’imi bu yerleşik mekanizmanın üzerine, ek izleme ve bildirim katmanı olarak konumlandırıyorum.
İzleme + Bildirim + Log: Tam Döngü
$kritikServisler = @("W3SVC", "MSSQLSERVER", "Spooler")
$logDosyasi = "C:\Loglar\servis_izleme.log"
foreach ($servis in $kritikServisler) {
$durum = Get-Service -Name $servis -ErrorAction SilentlyContinue
if ($durum.Status -ne "Running") {
$zaman = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
Add-Content -Path $logDosyasi -Value "$zaman - $servis DURDU, yeniden başlatılıyor"
try {
Start-Service -Name $servis -ErrorAction Stop
Add-Content -Path $logDosyasi -Value "$zaman - $servis başarıyla başlatıldı"
} catch {
Add-Content -Path $logDosyasi -Value "$zaman - $servis BAŞLATILAMADI: $($_.Exception.Message)"
Send-MailMessage -From "[email protected]" -To "[email protected]" `
-Subject "ACİL: $servis başlatılamadı!" -Body $_.Exception.Message -SmtpServer "smtp.sirket.com"
}
}
}
Zamanlanmış Görev ile 5 Dakikada Bir Kontrol
$tetikleyici = New-ScheduledTaskTrigger -Once -At (Get-Date) -RepetitionInterval (New-TimeSpan -Minutes 5) -RepetitionDuration ([TimeSpan]::MaxValue) $eylem = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-File C:\Scriptler\ServisIzleme.ps1" Register-ScheduledTask -TaskName "KritikServisIzleme" -Trigger $tetikleyici -Action $eylem -RunLevel Highest
Sahadan Bir Uyarı: Kök Nedeni Görmezden Gelmeyin
Otomatik yeniden başlatma, semptomu gizleyebilir. Bir servis günde birkaç kez otomatik olarak yeniden başlatılıyorsa, bu “sorun çözüldü” değil “sorun var ama görünmüyor” anlamına gelir. Log dosyanızı düzenli inceleyip, sık tekrarlayan yeniden başlatmaları kök nedene inmek için bir tetikleyici olarak kullanmanızı öneririm.
Sonuç
Windows’un yerleşik servis kurtarma özelliği ile PowerShell tabanlı izleme/bildirim katmanını birleştirmek, hem anlık kesintileri en aza indirir hem de tekrarlayan sorunları görünür kılarak kalıcı çözüme giden yolu açar.