Powershell ile Keep Alive scripti

Bir servisten on dakikada bir veri okuyup bazı işlemler yapılmasını gerektiren bir entegrasyon programı yazmam istendi. Buna benzer başka ihtiyaçlar da olacağı için zamanlanmış görev yöneticisi yazmanın daha iyi bir fikir olduğuna karar verdim ve Hangfire kullanan bir asp.net core mvc uygulaması yazdım. Hangfire, asp.net uygulamalarınıza nuget paketi olarak ekleyip zamanlanmış görevlerinizin çalışmasını sağlayabileceğiniz bir kütüphanedir.

IIS’te çalışan uygulamamız, dakikada bir çalışan bir test görevi olmasına rağmen 30 dakikada bir uyku moduna geçmeye başladı. Ben de buna çözüm aramaya başladım.

IIS’te yapılan ayarlar

Normal şartlar altında aşağıdaki ayarları yapınca problemin çözülmesi lazımdı:

  • IIS’teki uygulamanın Preload Enabled ayarının True yapılması
  • Uygulamanın kullandığı Application Pool’un Start Mode’unu Always Running yapılması
  • Application Pool’un refresh settinglerinin hepsinin pasif hale getirilmesi.

Bunları hiç biri çözüm olmadı.

Ping de çözüm değil

Uygulamamızın uptime’ı 3. parti bir platform tarafından izlenmekteydi. Uptime, ping atılarak kontrol edilir. Ping atıldığı halde uygulamanın neden uyku moduna geçtiğini ilk başta anlayamadım. Daha sonra ping’in uygulamayı değil host’u kontrol ettiğini hatırladım(bu da benim dikkatsizliğim)

Curl ile gelen çözüm

Henüz kalıcı bir çözüm bulamadım ama krizi engellemem gerekiyordu. Çünkü uygulama ödemelerle ilgiliydi. Bunun için eğer sayfa belirli aralıklarla görüntülenirse uygulama ayakta kalır düşüncesiyle aşağıdaki powershell scriptini yazdım:

$url = “https://api.ipify.org?format=json”
$interval = 10

while (1) {
    Start-Sleep -seconds $interval
    Clear-Host
    Write-Output “curled $($url) at $(get-date) `n”
    Invoke-WebRequest $url
};

While döngüsünün içindeki ilk satır, kodun çalışmasını $interval değerindeki kadar saniye bekletmektedir.

Invoke-WebRequest ise curl programı için bir wrapper’dır. Unix zamanlarından beri var olan curl programı basitçe bir http kaynağına get isteği gönderir ve çıktıyı ekrana yazdırır.

Clear-Host her seferinde ekranı temizlerken, Write-Output ile başlayan satır son işlem zamanını ve hangi adrese curl yapmakta olduğumuzu gösterir.

Sonuç

Problem için önerilen mantıklı çözümler işe yaramadı. Bu durumda olan sadece ben değilim. Github’da bir kaç kişiye yazdığım scriptin yaptığı işin aynısını yapan servisler yazılmasının önerildiğini gördüm. Her ne kadar problemi hala IIS konfigürasyonu ile çözebileceğime dair umudum olsa da, çözemezsem Powershell scriptimi bir servise çevirmeyi düşünebilirim.

Bunlarda ilginizi çekebilir

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir