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 vecatch
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"
).
- Kullanıcıya anlamlı bilgiler verin (örneğin,
- D. Düzenli Test Edin:
- Sunucular kapalı olduğunda betiğin nasıl davranacağını test edin.
- Sunucular kapalı olduğunda betiğin nasıl davranacağını test edin.