Windows ortamında rutin işleri otomatikleştirmek, her sysadmin’in hayatını kolaylaştıran en temel becerilerden biridir. Sabah 03:00’te log temizliği yapmak, her gece yedek almak ya da hafta sonu disk kullanım raporunu e-posta ile göndermek istiyorsanız, görev zamanlama araçlarına ihtiyacınız var. Windows’ta bu iş için iki eski dost var: AT komutu ve daha güçlü kardeşi SCHTASKS. Bu yazıda her ikisini de derinlemesine inceleyeceğiz, farkları ortaya koyacağız ve gerçek dünya senaryolarıyla nasıl kullanacağınızı göstereceğiz.
AT Komutu: Yaşlı Ama Sadık
AT komutu, Windows’un en eski görev zamanlama araçlarından biridir. Windows NT günlerinden beri var olan bu komut, basit ve hızlı görev planlaması için hâlâ kullanılabilir durumdadır. Ancak şunu baştan söyleyelim: AT komutu, Windows 8 ve Server 2012 ile birlikte deprecated (kullanımdan kaldırılmış) olarak işaretlenmiştir. Yani eski sistemleri yönetiyorsanız karşınıza çıkabilir, ama yeni kurulumlar için SCHTASKS kullanmanızı tavsiye ederim.
AT Komutunun Temel Kullanımı
AT komutunun sözdizimi oldukça basittir:
AT [\bilgisayar_adi] [gorev_id] [/DELETE] | AT [\bilgisayar_adi] [/EVERY:gun | /NEXT:gun] saat komut
Basit bir örnek verelim. Diyelim ki her gece 23:00’de bir batch script çalıştırmak istiyorsunuz:
AT 23:00 /EVERY:M,T,W,Th,F,S,Su "C:Scriptsdisk_temizlik.bat"
Bu komut, haftanın her günü 23:00’de belirtilen script’i çalıştırır. Peki mevcut görevleri görmek için ne yapıyoruz?
AT
Sadece AT yazmanız, sistemde planlanmış tüm görevleri listeler. Her görevin bir ID numarası vardır. Belirli bir görevi silmek için:
AT 1 /DELETE
Tüm görevleri bir anda silmek isterseniz:
AT /DELETE /YES
AT Komutunun Sınırlamaları
AT komutunu kullanırken mutlaka bilmeniz gereken bazı kısıtlamalar var:
- Güvenlik zafiyeti: AT ile oluşturulan görevler SYSTEM hesabı altında çalışır, bu da gereksiz yetki yükseltmesine yol açabilir.
- Sınırlı zamanlama seçenekleri: Karmaşık tetikleyiciler (sistem başlangıcında, oturum açılınca vb.) desteklenmez.
- GUI entegrasyonu yok: Görev Zamanlayıcı arayüzünde AT görevleri farklı bir şekilde görünür ve yönetimi zorlaşır.
- Windows 10/Server 2016 ve sonrası: Bu sistemlerde AT komutu tamamen çalışmayabilir veya kısıtlı çalışır.
SCHTASKS: Modern ve Güçlü Çözüm
SCHTASKS (Scheduled Tasks), AT komutunun yerini alan ve çok daha zengin özelliklere sahip komut satırı aracıdır. Görev Zamanlayıcı’nın (Task Scheduler) tüm özelliklerine komut satırından erişmenizi sağlar. Artık production ortamlarında sadece bunu kullanıyorum ve sizi de buna yönlendiriyorum.
SCHTASKS ile Görev Oluşturma
SCHTASKS’ın temel parametrelerini önce listeleyelim:
- /CREATE: Yeni görev oluşturur
- /DELETE: Görevi siler
- /QUERY: Görevleri listeler
- /CHANGE: Mevcut görevi değiştirir
- /RUN: Görevi hemen çalıştırır
- /END: Çalışan görevi durdurur
- /SHOWSID: Görevin güvenlik tanımlayıcısını gösterir
Şimdi /CREATE parametresinin alt seçeneklerine bakalım:
- /SC: Zamanlama türü (MINUTE, HOURLY, DAILY, WEEKLY, MONTHLY, ONCE, ONSTART, ONLOGON, ONIDLE)
- /TN: Görev adı (task name)
- /TR: Çalıştırılacak program veya script (task run)
- /ST: Başlangıç saati (start time) – HH:MM formatında
- /SD: Başlangıç tarihi (start date)
- /ED: Bitiş tarihi (end date)
- /RU: Görevi çalıştıracak kullanıcı hesabı (run as user)
- /RP: Kullanıcı şifresi
- /MO: Modifier, tekrar sıklığını belirtir
- /D: Haftanın günleri veya ayın günleri
- /M: Aylar
- /F: Görev zaten varsa üzerine yaz (force)
- /Z: Görev tamamlandıktan sonra sil
- /V1: Windows XP/2003 uyumlu görev oluştur
İlk Gerçek Dünya Senaryosu: Otomatik Yedekleme
Bir müşteri ortamında şöyle bir senaryo ile karşılaştım: Her gece 02:00’de SQL Server yedeklerini harici bir paylaşıma kopyalamak gerekiyordu. İşte o ortam için yazdığım görev:
SCHTASKS /CREATE /TN "Gece SQL Yedek Kopyalama" /TR "C:Scriptssql_backup_copy.bat" /SC DAILY /ST 02:00 /RU "DOMAINbackup_servis" /RP "GucluSifre123!" /F
Bu komutla birlikte:
- Görev adı “Gece SQL Yedek Kopyalama” olarak belirlendi
- Her gün 02:00’de çalışacak şekilde ayarlandı
- Domain’deki özel bir servis hesabı ile çalışacak şekilde yapılandırıldı
Haftalık Görev Oluşturma
Disk kullanım raporunu her Pazartesi sabahı 08:00’de oluşturup yöneticiye mail atmasını istiyorsunuz. Bunun için:
SCHTASKS /CREATE /TN "Haftalik Disk Raporu" /TR "C:Scriptsdisk_raporu.ps1" /SC WEEKLY /D MON /ST 08:00 /RU SYSTEM /F
Burada dikkat edin: PowerShell script’lerini doğrudan çalıştırmak yerine, aslında şu şekilde yapmak daha sağlıklıdır:
SCHTASKS /CREATE /TN "Haftalik Disk Raporu" /TR "powershell.exe -ExecutionPolicy Bypass -File C:Scriptsdisk_raporu.ps1" /SC WEEKLY /D MON /ST 08:00 /RU SYSTEM /F
Aylık Görev: Sistem Temizliği
Her ayın 1. günü temp dosyaları temizlemek için:
SCHTASKS /CREATE /TN "Aylik Temp Temizligi" /TR "C:Scriptstemp_cleanup.bat" /SC MONTHLY /D 1 /ST 04:00 /RU SYSTEM /F
Eğer belirli aylarda çalıştırmak isterseniz (örneğin sadece Ocak, Nisan, Temmuz ve Ekim’de, yani çeyrek dönem başlarında):
SCHTASKS /CREATE /TN "Ceyrek Donem Temizligi" /TR "C:Scriptsquarterly_cleanup.bat" /SC MONTHLY /M JAN,APR,JUL,OCT /D 1 /ST 04:00 /RU SYSTEM /F
Sistem Başlangıcında Çalışan Görev
Sunucu yeniden başladıktan sonra otomatik olarak bir servis kontrol script’i çalıştırmak istiyorsunuz:
SCHTASKS /CREATE /TN "Baslangic Servis Kontrol" /TR "C:Scriptsservis_kontrol.bat" /SC ONSTART /DELAY 0002:00 /RU SYSTEM /F
/DELAY parametresi, sistem başladıktan 2 dakika sonra görevi tetikler. Bu önemli, çünkü sistem henüz tam olarak ayağa kalkmadan script çalışırsa kontrol etmek istediğiniz servisler hazır olmayabilir.
Görevleri Listeleme ve Sorgulama
Sistemdeki tüm görevleri listelemek için:
SCHTASKS /QUERY /FO LIST
Daha okunabilir bir çıktı için:
SCHTASKS /QUERY /FO LIST /V
/V parametresi verbose (ayrıntılı) modda çalıştırır ve her görev hakkında çok daha fazla bilgi verir: son çalışma zamanı, sonraki çalışma zamanı, çalışma durumu ve hatta exit kodu.
Belirli bir görevi sorgulamak için:
SCHTASKS /QUERY /TN "Gece SQL Yedek Kopyalama" /FO LIST /V
CSV formatında çıktı almak (raporlama için çok işe yarıyor):
SCHTASKS /QUERY /FO CSV /NH > C:Raporlargorev_listesi.csv
Görev Silme ve Değiştirme
Bir görevi silmek için:
SCHTASKS /DELETE /TN "Eski Gorev Adi" /F
/F parametresi olmadan çalıştırırsanız, onay sorusu çıkar. Script içinde kullanıyorsanız /F eklemeyi unutmayın.
Mevcut bir görevin çalışma saatini değiştirmek:
SCHTASKS /CHANGE /TN "Gece SQL Yedek Kopyalama" /ST 03:00
Görevi devre dışı bırakmak (silmeden):
SCHTASKS /CHANGE /TN "Gece SQL Yedek Kopyalama" /DISABLE
Tekrar etkinleştirmek için:
SCHTASKS /CHANGE /TN "Gece SQL Yedek Kopyalama" /ENABLE
Uzak Bilgisayarda Görev Yönetimi
SCHTASKS’ın güzel özelliklerinden biri, uzak sistemlerdeki görevleri de yönetebilmeniz. Onlarca sunucuyu tek bir komut satırından yönetiyorsanız bu inanılmaz zaman kazandırır:
SCHTASKS /QUERY /S UZAK-SUNUCU-01 /U DOMAINadmin /P "Sifre123" /FO LIST
Uzak sunucuya yeni görev eklemek:
SCHTASKS /CREATE /S UZAK-SUNUCU-01 /U DOMAINadmin /P "Sifre123" /TN "Uzak Yedek Gorevi" /TR "C:Scriptsbackup.bat" /SC DAILY /ST 02:00 /RU SYSTEM /F
Dakika Bazlı Tekrarlayan Görevler
Monitoring senaryolarında her 5 dakikada bir servis durumunu kontrol etmek gerekebilir:
SCHTASKS /CREATE /TN "Servis Izleme" /TR "C:Scriptsservis_izle.bat" /SC MINUTE /MO 5 /RU SYSTEM /F
Ya da her saat başı log analizi:
SCHTASKS /CREATE /TN "Saatlik Log Analiz" /TR "powershell.exe -ExecutionPolicy Bypass -File C:Scriptslog_analiz.ps1" /SC HOURLY /MO 1 /ST 00:00 /RU SYSTEM /F
Gerçek Dünya Senaryosu: Toplu Görev Dağıtımı
Şirketimizde 50 Windows Server var ve her birine aynı monitoring görevini kurmam gerekiyordu. Elle tek tek yapmak yerine şöyle bir batch script yazdım:
@echo off
setlocal enabledelayedexpansion
set GOREV_ADI=Monitoring-Script-v2
set SCRIPT_YOLU=C:Scriptsmonitor.ps1
set SAAT=00:30
for %%S in (SUNUCU01 SUNUCU02 SUNUCU03 SUNUCU04 SUNUCU05) do (
echo %%S sunucusuna gorev kuruluyor...
SCHTASKS /DELETE /S %%S /TN "%GOREV_ADI%" /F 2>nul
SCHTASKS /CREATE /S %%S /TN "%GOREV_ADI%" /TR "powershell.exe -ExecutionPolicy Bypass -NonInteractive -File %SCRIPT_YOLU%" /SC HOURLY /MO 1 /ST %SAAT% /RU SYSTEM /F
if !ERRORLEVEL! EQU 0 (
echo %%S - BASARILI
) else (
echo %%S - HATA! Log kontrol edilmeli.
)
)
echo.
echo Tum sunucularda gorev kurulumu tamamlandi.
pause
Bu script ile 5 dakika içinde tüm sunuculara görev kurulumunu tamamladım.
SCHTASKS ile Hata Ayıklama
Görevleriniz beklendiği gibi çalışmadığında ne yapacaksınız? İşte birkaç pratik ipucu:
Görevin son çalışma sonucunu kontrol edin:
SCHTASKS /QUERY /TN "Gorev Adi" /FO LIST /V | findstr "Last Run|Last Result|Status"
Görev başarıyla çalışıp çalışmadığını ERRORLEVEL ile kontrol etmek için bir test script’i:
SCHTASKS /RUN /TN "Gece SQL Yedek Kopyalama"
if %ERRORLEVEL% EQU 0 (
echo Gorev baslatildi
) else (
echo Gorev baslatma HATASI - ERRORLEVEL: %ERRORLEVEL%
)
Görev Zamanlayıcı event loglarına bakmak da çok işe yarar. Event Viewer’da Applications and Services Logs > Microsoft > Windows > TaskScheduler > Operational altında tüm görev çalışma geçmişini bulabilirsiniz.
Güvenlik İpuçları
Görev zamanlayıcı, yanlış yapılandırıldığında ciddi bir güvenlik açığı olabilir. Şunlara dikkat edin:
- SYSTEM hesabından kaçının: Mümkün olduğunda minimum yetkiye sahip özel servis hesapları kullanın.
- Script yollarını güvenli tutun: Görevin çalıştırdığı script’e sadece gerekli kullanıcıların yazma erişimi olsun. Aksi halde bir saldırgan script’i değiştirip SYSTEM yetkisiyle kod çalıştırabilir.
- Şifreleri komut geçmişinde bırakmayın:
/RPparametresiyle şifre girerken dikkatli olun, komut geçmişine kaydolur. - Görev listesini düzenli denetleyin: Özellikle domain ortamlarında kim ne zaman görev eklemiş, kontrol altında tutun.
SCHTASKS /QUERY /FO CSV /NH | findstr /V "TaskName" > C:Auditgorev_denetim.csv
Bu komutu haftalık çalıştırıp çıktıyı kaydedin. Yeni bir görev eklendiğinde fark edilir.
AT mi, SCHTASKS mi?
Bu sorunun cevabı artık net: Her zaman SCHTASKS kullanın. AT komutunu sadece çok eski sistemleri (Windows Server 2003 ve öncesi) yönetirken veya mevcut AT görevlerini SCHTASKS’a migrate ederken kullanabilirsiniz. Bunun dışında AT’e ihtiyacınız yok.
SCHTASKS’ın avantajları:
- Zengin tetikleyiciler: Oturum açma, boşta kalma, sistem başlangıcı gibi olaylarla tetikleyebilirsiniz.
- Kullanıcı hesabı kontrolü: Hangi hesapla çalışacağını tam olarak belirleyebilirsiniz.
- Hata yönetimi: Görev başarısız olduğunda ne yapılacağını ayarlayabilirsiniz.
- Uzak yönetim: Ağdaki diğer makinelerin görevlerini yönetebilirsiniz.
- Görev Zamanlayıcı GUI ile uyum: Komut satırından oluşturduğunuz görevleri arayüzden de görebilir ve yönetebilirsiniz.
- PowerShell entegrasyonu: Modern scripting workflow’larıyla mükemmel çalışır.
Sonuç
Görev zamanlama, Windows sistem yönetiminin temel taşlarından biridir. AT komutu tarihsel bir öneme sahip olsa da günümüz ortamları için SCHTASKS açık ara daha iyi seçenektir. Bu yazıda ele aldığımız senaryoların büyük bölümü gerçek production ortamlarında karşılaştığım durumlardan derlenmiştir.
SCHTASKS’ı öğrenirken en iyi yöntem, küçük test görevleri oluşturup davranışlarını gözlemlemektir. Önce bir test sunucusunda deneyin, çıktıları inceleyin, hataları anlayın. Görev Zamanlayıcı’nın GUI’sini paralel olarak açık tutmanız da başlangıçta ne yaptığınızı görsel olarak takip etmenize yardımcı olur.
Otomasyonun güzelliği şurada: Bir kez doğru kurduğunuzda, o görev sizin yerinize aylarca, yıllarca çalışır. Sabah 07:00’de ofise geldiğinizde gece 03:00’teki yedek alınmış, loglar temizlenmiş, raporlar hazırlanmış olur. İşte bu yüzden görev zamanlama, her sysadmin’in toolbox’ında olmazsa olmaz bir araçtır.