Sunucu Hizmet İzleme, PowerShell ile Güvenli ve Etkili Betik Oluşturma

PowerShell

Havayolu şirketleri gibi kritik sistemlerde çalışan ortamlarda, sunucular üzerindeki hizmetlerin sürekli olarak izlenmesi hayati öneme sahiptir. Herhangi bir hizmetin durması veya bağlantı hatası, uçuş planlaması, rezervasyon sistemi veya güvenlik süreçlerini doğrudan etkileyebilir. Bu yazıda, Get-Service cmdlet’i ve try-catch hata işleme yapısı kullanılarak, havayolu şirketinin birden fazla Windows sunucusunda belirli bir hizmetin durumunu güvenli bir şekilde kontrol eden PowerShell betiği nasıl yazılır?

Neden Get-Service ve try-catch?

Bu senaryo için önerilen yaklaşımın temel gerekçeleri şunlardır:

A. Get-Service Cmdlet’i: Doğal ve Basit Çözüm
  • Get-Service, Windows hizmetlerini sorgulamak için doğrudan tasarlanmıştır.
  • Komut satırında Get-Service -Name “Spooler” gibi basit bir komutla hizmetin durumu (Running, Stopped, vb.) alınabilir.
  • Uzak sunucularda çalıştırılabilmesi için Invoke-Command ile birlikte kullanılabilir.
B. try-catch: Bağlantı Hatalarını Yakalama ve Yönetme

Uzak sunuculara bağlantı sırasında şu hatalar oluşabilir:

  • Sunucu kapalı veya erişilemez.
  • Hizmet adı yanlış veya mevcut değil.
  • Yetkilendirme sorunları (örneğin, erişim reddedildi).

try-catch yapısı, bu tür istisnaları yakalayarak betiğin çökmesini engeller ve özel hata mesajları gösterir.

Örneğin, bir sunucuya erişilemediğinde kullanıcıya “Sunucuya ulaşılamıyor” gibi bilgilendirici bir mesaj verilebilir.

Uzak Sunucularda Hizmet Durumu Kontrolü

# İzlenecek sunucular ve hizmet adı
$servers = "Server01", "Server02", "Server03"
$serviceName = "FlightScheduler"

foreach ($server in $servers) {
    try {
        # Uzak sunucuda hizmet durumunu sorgula
        $service = Invoke-Command -ComputerName $server -ScriptBlock {
            Get-Service -Name $using:serviceName -ErrorAction Stop
        } -ErrorAction Stop

        # Hizmet durumunu kontrol et
        if ($service.Status -eq "Running") {
            Write-Host "$server üzerinde $serviceName hizmeti aktif." -ForegroundColor Green
        } else {
            Write-Host "$server üzerinde $serviceName hizmeti durmuş!" -ForegroundColor Red
            # Alternatif işlem (örneğin, uyarı e-postası gönderme)
            Send-MailMessage -To "admin@airline.com" -From "monitor@airline.com" `
                -Subject "Uyarı: Hizmet Durduruldu - $server" `
                -Body "$serviceName hizmeti $server üzerinde çalışmıyor!" `
                -SmtpServer "smtp.airline.com"
        }
    } catch {
        # Bağlantı veya hata durumlarını yakala
        Write-Host "$server üzerinde hizmet kontrolü başarısız: $($_.Exception.Message)" -ForegroundColor Yellow
        # Kritik hataları logla
        Write-EventLog -LogName "Application" -Source "ServiceMonitor" `
            -EntryType Error -EventID 5001 `
            -Message "Sunucu: $server | Hata: $($_.Exception.Message)"
    }
}

A. Invoke-Command ile Uzak Sunucu Erişimi

  • Invoke-Command cmdlet’i, uzak sunucularda komut çalıştırmanızı sağlar.
  • -ComputerName parametresiyle hedef sunucu belirlenir.
  • using: değişkeni, yerel değişkenleri uzak komut bloğuna aktarır.

B. -ErrorAction Stop ile İstisna Tetikleme

  • Get-Service, hizmet bulunamadığında varsayılan olarak hata vermez (non-terminating error).
  • -ErrorAction Stop ile bu tür hatalar istisna olarak tetiklenir ve catch bloğu tarafından yakalanabilir.

C. Send-MailMessage ile Uyarı Bildirimi

  • Hizmet durduğunda e-posta ile bildirim gönderilir.
  • Bu, IT ekibine hızlı müdahale imkanı sunar.

D. Write-EventLog ile Hata Kaydı

  • Kritik hatalar Windows Olay Günlüğüne yazılır.
  • Bu loglar, ileride analiz için saklanabilir.

Gereksinimler:

  • A. Güvenli Bağlantılar:
    • Invoke-Command için PowerShell Remoting (WinRM) yapılandırması yapılmalıdır.
    • Güvenli protokoller (örneğin HTTPS) kullanın.
  • B. Sıkışık Ağları Dikkate Alın:
    • -ThrottleLimit parametresiyle aynı anda kaç sunucuya bağlanılacağını sınırlayın.
  • C. Hata Mesajlarını Özelleştirin:
    • Kullanıcıya anlamlı bilgiler verin (örneğin, "Hizmet bulunamadı" yerine "FlightScheduler hizmeti Server01'de yok").
  • D. Düzenli Test Edin:
    • Sunucular kapalı olduğunda betiğin nasıl davranacağını test edin.

      Hata
      Açıklama
      Çözüm
      Access is denied
      Yetki eksikliği
      Betiği yönetici haklarıyla çalıştırın veyaEnter-PSSessionile kimlik doğrulaması yapın.
      The RPC server is unavailable
      Sunucuya erişilemiyor
      Ağ bağlantısını kontrol edin veya-ThrottleLimitazaltın.
      Service does not exist
      Hizmet adı yanlış
      Get-Servicekomutunu doğrulayın.

      Bu betik, havayolu şirketinin sunucularındaki kritik hizmetlerin izlenmesi için güvenilir bir çözüm sunar. Get-Service ve try-catch kombinasyonu, hem basit hem de güçlüdür. Özellikle bağlantı hatalarını yönetebilme ve özel uyarılar tanımlayabilme özellikleri, havayolu sektöründe kesintisiz hizmet sunulmasını sağlar. Betiği Zamanlanmış Görev (Task Scheduler) ile otomatikleştirerek her X dakikada bir çalıştırabilirsiniz.