# PowerShell ile Windows Servis İzleme ve Otomatik Yeniden Başlatma Görevleri

- Bağlantı: https://musti.org/powershell/powershell-servis-izleme-otomatik-restart/
- Yayımlanma: 2026-09-21T21:38:31+03:00
- Yazar: mmutlu

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 "uyari@sirket.com" -To "mmutlu@sirket.com" `
                    -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.
