Kafayı yiyecektim! Düzenli olarak çalışan, rapor üreten, her şeyi yolunda giden bir Python script'im vardı. Sonra bir gün baktım, rapor yok. Sistemde hiçbir hata, hiçbir uyarı, hiçbir şey. Script sessiz sedasız ölmüş, kimseye veda bile etmemiş.
Sessiz Ölümün İzinde
Olay yerine ilk gittiğimde, Task Scheduler'da her şey "Başarıyla Çalıştı" yazıyordu. Son çalışma tarihi de doğruydu. Ama iş yapmamıştı. Log dosyam bomboştu. Sessiz failure en kötüsü ya, nereden başlayacağını bilemiyorsun. İlk şüphem script'in içindeki bir hata oldu, saatlerce debug ettim, ama yerelde çalışıyordu.
Sonra aklıma, makinede başka bir proje için Python sürümünü güncellemiş olmam geldi. PATH değişmişti. Meğerse Scheduled Task, "Program/Script" kısmına sadece `python.exe` yazınca, eski PATH'tan bakıyor ve bulamayınca da sıfır çıkış koduyla pat diye kapanıyordu. Hiçbir hata fırlatmıyordu! Şaka gibi.
Çözüm (Sandığım) ve Yeni Sorun
"Tamam" dedim, "PATH'e güvenmeyeyim, direkt python.exe'nin mutlak yolunu yazayım." Hemen Task'ı düzenledim.
Bu sefer de, script'im sanal ortamda (venv) çalışıyordu ve task, sanal ortamı aktifleştiremiyordu. requirements.txt'deki kütüphaneleri bulamadığı için yine hata verdi, ama bu sefer en azından log'da görebildim. İlerleme!
Nihai Kurtuluş Yolu
Sonunda bulduğum çözüm, Scheduled Task'ı sadece `python.exe` ile değil, batch file (.bat) ile çalıştırmak oldu. Batch dosyasının içinde hem PATH'i, hem de sanal ortımı istediğim gibi ayarlayabildim.
Böylece task sadece bu batch'i çalıştırıyor, o da her şeyi hallediyor. Artık log dosyam her şeyi söylüyor.
Özetle: Windows Scheduled Task, özellikle Python ve sanal ortam söz konusu olduğunda acımasız bir ortam. PATH değişikliklerinden hiç hoşlanmıyor. Mutlak yollar ve wrapper batch/powershell script'leri hayat kurtarıyor.
Siz de böyle "sessiz ölüm" yaşadınız mı? Scheduled Task'larınızı nasıl güvenilir hale getirdiniz? Batch'ten daha temiz bir yolu var mı?
Olay yerine ilk gittiğimde, Task Scheduler'da her şey "Başarıyla Çalıştı" yazıyordu. Son çalışma tarihi de doğruydu. Ama iş yapmamıştı. Log dosyam bomboştu. Sessiz failure en kötüsü ya, nereden başlayacağını bilemiyorsun. İlk şüphem script'in içindeki bir hata oldu, saatlerce debug ettim, ama yerelde çalışıyordu.
Sonra aklıma, makinede başka bir proje için Python sürümünü güncellemiş olmam geldi. PATH değişmişti. Meğerse Scheduled Task, "Program/Script" kısmına sadece `python.exe` yazınca, eski PATH'tan bakıyor ve bulamayınca da sıfır çıkış koduyla pat diye kapanıyordu. Hiçbir hata fırlatmıyordu! Şaka gibi.
"Tamam" dedim, "PATH'e güvenmeyeyim, direkt python.exe'nin mutlak yolunu yazayım." Hemen Task'ı düzenledim.
Kod:
C:\Users\Kullanici\AppData\Local\Programs\Python\Python39\python.exe
Bu sefer de, script'im sanal ortamda (venv) çalışıyordu ve task, sanal ortamı aktifleştiremiyordu. requirements.txt'deki kütüphaneleri bulamadığı için yine hata verdi, ama bu sefer en azından log'da görebildim. İlerleme!
Sonunda bulduğum çözüm, Scheduled Task'ı sadece `python.exe` ile değil, batch file (.bat) ile çalıştırmak oldu. Batch dosyasının içinde hem PATH'i, hem de sanal ortımı istediğim gibi ayarlayabildim.
Kod:
@echo off
C:\Yol\To\venv\Scripts\activate.bat
python C:\Yol\To\benim_scriptim.py >> C:\Yol\To\log.txt 2>&1
Böylece task sadece bu batch'i çalıştırıyor, o da her şeyi hallediyor. Artık log dosyam her şeyi söylüyor.
Özetle: Windows Scheduled Task, özellikle Python ve sanal ortam söz konusu olduğunda acımasız bir ortam. PATH değişikliklerinden hiç hoşlanmıyor. Mutlak yollar ve wrapper batch/powershell script'leri hayat kurtarıyor.
Siz de böyle "sessiz ölüm" yaşadınız mı? Scheduled Task'larınızı nasıl güvenilir hale getirdiniz? Batch'ten daha temiz bir yolu var mı?