Sistem/DevOps•6 dk okuma

Windows Görev Zamanlayıcısı'nda (Task Scheduler) Kilitlenen Arka Plan Görevlerini Tespit Edip Kendini Kurtaran Sağlık Döngüsü

ERP entegrasyonları ve banka veri aktarım scriptlerinin Task Scheduler üzerinde 'Running' durumunda asılı kalıp bir daha hiç çalışmaması problemine karşı kendini iyileştiren (Self-Healing) watchdog mimarisi.

AE

Ahmet Ertekin

15 March 2022

Windows Görev Zamanlayıcısı'nda (Task Scheduler) Kilitlenen Arka Plan Görevlerini Tespit Edip Kendini Kurtaran Sağlık Döngüsü

Windows Görev Zamanlayıcısı'nda (Task Scheduler) Kilitlenen Arka Plan Görevlerini Tespit Edip Kendini Kurtaran Sağlık Döngüsü

Şirketlerde muhasebe entegrasyonları, e-fatura transferleri veya veri ambarı aktarımları genellikle Windows Task Scheduler (Zamanlanmış Görevler) üzerinde çalışan betiklerle yürütülür. Ancak bir veritabanı kilitlendiğinde veya ağ anlık koptuğunda, bu görev arka planda sonsuz bir döngüye girer. Task Scheduler arayüzünde görevin durumu günlerce "Running" (Çalışıyor) olarak asılı kalır. Görev zaten çalışıyor göründüğü için bir sonraki zamanlanmış saatte tekrar tetiklenmez; şirket entegrasyonu günlerce sessizce durur! Bu kilitlenmeleri engelleyen Watchdog (Gözetleme Köpeği) mimarisi.

1. Task Scheduler Ayarlarında Yapılan Hayati Hata

Birçok teknisyen görev oluştururken varsayılan ayarları değiştirmeden "Next" der. Ancak görev özelliklerindeki Settings sekmesinde şu iki ayar hayati önem taşır:

  1. "Stop the task if it runs longer than:" (İşaretlenmelidir! Örn: Normalde 5 dakikada biten bir görev için: 2 Hours seçilmelidir. 2 saati geçerse Windows görevi zorla sonlandırır).
  2. "If the running task does not end when requested, force it to stop" (İşaretli olmalıdır).
  3. "If the task is already running, then the following rule applies:"
    • Do not start a new instance yerine
    • Stop the existing instance seçilmelidir!

2. Otonom Watchdog PowerShell Betiği

Sunucuda çalışan bağımsız bir izleme scripti her saat başı görevleri denetler:

$CriticalTasks = @(
    "\Holding_Entegrasyon\Banka_Aktarim_Job",
    "\Holding_Entegrasyon\Stok_Guncelleme_Job"
)

$MaxExecutionMinutes = 60

foreach ($TaskPath in $CriticalTasks) {
    $task = Get-ScheduledTask -TaskPath ($TaskPath.Split("\")[0..($TaskPath.Split("\").Length-2)] -join "\") `
        -TaskName ($TaskPath.Split("\")[-1]) -ErrorAction SilentlyContinue

    if ($task.State -eq "Running") {
        $taskInfo = Get-ScheduledTaskInfo -TaskName $task.TaskName
        $RunningDuration = (Get-Date) - $taskInfo.LastRunTime
        
        if ($RunningDuration.TotalMinutes -gt $MaxExecutionMinutes) {
            Write-Warning "DİKKAT: $($task.TaskName) görevi $([int]$RunningDuration.TotalMinutes) dakikadır kilitli! Zorla durduruluyor..."
            
            # Görevi ve arkasındaki takılı kalmış powershell.exe / cmd.exe sürecini öldür
            Stop-ScheduledTask -TaskName $task.TaskName
            Start-Sleep -Seconds 5
            
            # Görevi sıfırdan temiz olarak yeniden başlat
            Start-ScheduledTask -TaskName $task.TaskName
            
            # IT Ekibine bildirim gönder
            Send-MailMessage -SmtpServer "smtp.holding.local" -From "alert@holding.com" -To "sistem@holding.com" `
                -Subject "OTONOM MÜDAHALE: Kilitlenen $($task.TaskName) Yeniden Başlatıldı" `
                -Body "Görev $($RunningDuration.TotalMinutes) dakika takılı kaldığı için sistem tarafından otonom olarak sonlandırılıp yeniden tetiklendi."
        }
    }
}

Karşılaşılan Kritik Hatalar ve Çözüm İpuçları

  • Hata Kodu 0x41301 (Task is currently running): Görev kilitlendiğinde Last Run Result sütununda bu hex kod görünür. Bu kodu Event Viewer'da TaskScheduler Operational logları altında izleyebilirsiniz.
  • Kullanıcı Oturumu Açık Olmadığında Çalışmama: Görev ayarlarında "Run whether user is logged on or not" (Kullanıcı oturum açmış olsun veya olmasın çalıştır) kutucuğu işaretlenmeli ve servise Log on as a batch job yerel güvenlik yetkisi verilmelidir.

Mühendis Notu

Bir sistemin kendi kendini iyileştirebilmesi (Self-Healing), modern DevOps ve SRE disiplininin temel taşıdır. İnsan müdahalesini beklemek yerine kilitlenen görevi algılayıp kendini yeniden başlatan sistemler kurmak operasyonel mükemmelliktir.