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:
- "Stop the task if it runs longer than:" (İşaretlenmelidir! Örn: Normalde 5 dakikada biten bir görev için:
2 Hoursseçilmelidir. 2 saati geçerse Windows görevi zorla sonlandırır). - "If the running task does not end when requested, force it to stop" (İşaretli olmalıdır).
- "If the task is already running, then the following rule applies:"
Do not start a new instanceyerineStop the existing instanceseç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 jobyerel 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.
