28.05.2024

Kapanan sunucudan haberdar olmak

Sunucular önemli. Onlar ne zaman yeniden başlamış, sebebi neymiş gibi sorular hep var. Bu soruların cevaplarını ben daha sormadan bulacak bir yöntemim olmasını istedim. Söz konusu sunucular Windows. Linux için de benzer bir yöntem bulunabilir elbet, önemli olan mantık.

Windows'da bir zamanlanmış görev oluşturayım. D:\bildir.ps1 konumundaki powershell betiğini çalıştırsın.

$act1 = New-ScheduledTaskAction -Execute powershell.exe 
-Argument "-ExecutionPolicy Bypass -NoProfile -File D:\bildir.ps1"
-WorkingDirectory "D:\"

Tetikleyici olarak da Sistem açılışını seçeyim.

$trig1 = New-ScheduledTaskTrigger -AtStartup 

Bu işi bir kullanıcının hesabı ile değil, SYSTEM hesabı ile yapacağım. Yüksek yetkilere ihtiyacım yok, standart yetkiler yeterli.

$prin1 = New-ScheduledTaskPrincipal -UserId "SYSTEM" -LogonType ServiceAccount -RunLevel Limited 

Önce görev nesnesini oluşturup sonrasında kaydetmek istiyorum. Bu işi iki adımda yapacağım.

$tsk1  = New-ScheduledTask -Action $act1 -Principal $prin1 -Trigger $trig1
$tsk1 | Register-ScheduledTask -TaskName "YenidenbaslatmaBildirimi" -TaskPath "\Firma"

Sıra geldi D:\bildir.ps1 betiğini oluşturmaya. Bu aşamaya kadar bilgisayar çoktan yeniden başladı. Betik bize açılıştan sonra bildirim verecek. Bu amaca yönelik aşağıdaki içerik yeterli:

$tarih = Get-Date -Format "yyyy-MM-ddTHH-mm-ss"
$sunucu_adi=$env:COMPUTERNAME
$smtpParams = @{
   From = "$sunucu_adi@firma.com"
   To = "admin@firma.com"
   Body = "$tarih - $sunucu_adi yeniden basladi"
   Subject = "$sunucu_adi yeniden basladi"
   SmtpServer = "smtp.firma.com"
}
Send-MailMessage @smtpParams
Add-Content -Value "$tarih - $sunucu_adi" -Path D:\bildir.log

Bu kısmı sadece sunucunun ne zaman başladığını bildirdi. Biraz da nedene olaklanalım. Windows'da nedeni bulmak için birkaç farklı yere bakmak gerekebilir. Olası sebepler Windows Update, güç kaybı, operatör isteği veya kritik bir uygulamanın hata vermesi olabilir. Bütün bu olayları içine alan bir olay kaydı günlüğünü inceleyelim:

$olaylar = Get-WinEvent -FilterHashTable @{LogName='System';`
StartTime=(Get-Date).AddHours(-1);`
ID=19,20,21,22,26,27,41,109,1000,1001,1002,1074,1076,6005,6006,6008} -ea silent

Bazen hiçbir olay dönmeyebilir. Bu gibi durumlarda, hata vermemesi için sonuna -ea silent (-ErrorAction SilentlyContinue kısaltması) ekledim. Daha sonra bu olayların içeriklerini gönderilecek mesajın gövdesine ekleyelim. Yukarıdaki betikte mesajın gövdesi $smtpParams içinde kısa bir şekilde oluşturulmuştu. Örneği bozmamak için aşağıdaki kodu bu splat değişkeninin ardından, Send-MailMessage cmdlet'inden önce olmasını düşündüm.

foreach ($olay in $olaylar) {
    $Body += "$($olay.TimeCreated) - $($olay.Id) - $($olay.Message)"
}

Bu şekilde en üstte tarih ve saatin yanında sunucu adı ve "yeniden basladi" görünecek. Ardından son 1 saatte konuyla ilgili olabilecek tüm olay kayıtları listelenecek. Bu elbette iyileştirmeye açık.

Hiç yorum yok: