Bir servis gece yarısı durursa ve bunu ancak sabah gelen kullanıcı şikayetiyle öğrenirseniz, aslında önlenebilir bir sorunu reaktif şekilde çözmüş olursunuz. Peki bu kesintiyi kimse fark etmeden, servis kendi kendine ayağa kalkacak şekilde tasarlayamaz mısınız? Cevap evet — ve bunun için karmaşık bir araca ihtiyacınız yok.
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ı
Birçok durumda PowerShell scripti yazmadan önce Windows’un yerleşik servis kurtarma özelliğini kullanmak daha sağlam bir ilk savunma hattı:
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ğlıyor. PowerShell script’ini bu yerleşik mekanizmanın üzerine, ek izleme ve bildirim katmanı olarak konumlandırmak daha sağlam bir sonuç veriyor.
İ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
Otomatik Yeniden Başlatma Bir Çözüm Değil, Bir Kazanılmış Zaman
Burada dikkatli olunması gereken bir nokta var: 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 artık görünmüyor” anlamına geliyor. Log dosyasını düzenli incelemek ve sık tekrarlayan yeniden başlatmaları kök nedene inmek için bir tetikleyici olarak kullanmak gerekiyor.
Windows’un yerleşik servis kurtarma özelliği ile PowerShell tabanlı izleme/bildirim katmanını birlikte kullandığınızda hem anlık kesintileri en aza indirmiş hem de tekrarlayan sorunları görünür kılarak kalıcı çözüme giden yolu açmış olursunuz.