Linux'ta cron ne ise Windows'ta Görev Zamanlayıcı (Task Scheduler) odur: betik, yedek ve sağlık kontrollerini otomatik çalıştırır. Bu rehber GUI, schtasks, PowerShell, WSL cron ve gerçek hata kodlarıyla Windows tarafını anlatır; Linux karşılaştırması için Linux cron job ve macOS için macOS cron / launchd sayfalarına bakın.
Cron ifadesini Windows'a çevirirken crontab sözdizimi tablosu yardımcı olur. Hazır aralık üretmek için cron expression generator kullanabilirsiniz; Windows'ta aynı aralığı /sc ve /mo ile kurarsınız.
En sık sessiz başarısızlık: görev “Çalışıyor” görünür ama çalışma dizini C:\Windows\System32 olur, göreli yollar kırılır. Script'te mutlak yol kullanın; PowerShell'de -WorkingDirectory verin.
.NET uygulamasında görevleri Windows servisinden bağımsız yönetmek istiyorsanız Hangfire ve Quartz.NET ile .NET zamanlama mimarilerini karşılaştırın. Tetikleyici, eylem ve çalışma hesabı arasındaki ilişkiyi netleştirmek için de zamanlanmış görevin temel bileşenlerini inceleyin.
Görev Zamanlayıcı'ya Erişim
Windows 10/11 ve Windows Server'da aynı MMC konsolu kullanılır. Sunucuda Uzak Masaüstü ile bağlandıktan sonra da taskschd.msc açabilirsiniz; uzaktan yönetim için uygun yetki gerekir.
- Başlat'ta “Görev Zamanlayıcı” veya “Task Scheduler” arayın.
- Veya
Win+R→taskschd.msc→ Enter. - Komut satırı:
schtasks; PowerShell:Get-ScheduledTask.
Task Scheduler vs Linux Cron
| Özellik | Windows Task Scheduler | Linux Cron |
|---|---|---|
| Arayüz | GUI + CLI + PowerShell | CLI (crontab) |
| Zamanlama | Saniye / olay / oturum | Dakika (zaman) |
| Koşullar | Ağ, pil, boşta | Script içinde |
| Yeniden deneme | Yerleşik | Manuel |
| Geçmiş | Görev Geçmişi / Event Log | syslog / yönlendirilmiş log |
GUI ile Görev Oluşturma
taskschd.mscaçın → sağda Görev Oluştur (Create Task; Basit Görev Sihirbazı yerine bunu tercih edin).- Genel: ad, “Kullanıcı oturum açmış olsun veya olmasın çalıştır”, gerekirse “En yüksek ayrıcalıklarla çalıştır”.
- Tetikleyiciler: günlük / haftalık / bir kez / oturum açılışı / başlangıç.
- Eylemler: Program/script — örn.
PowerShell.exe; bağımsız değişkenler:-NoProfile -ExecutionPolicy Bypass -File C:\scripts\yedek.ps1; Başlangıç konumu:C:\scripts. - Koşullar: dizüstünde “Yalnızca AC gücü” işaretini kaldırın; ağ gerektiren işlerde ağı işaretleyin.
- Ayarlar: “Kaçırılan görevi mümkün olan en kısa sürede çalıştır” ve başarısızlıkta yeniden başlatmayı açın.
schtasks ile Görev Oluşturma
Microsoft belgesindeki temel sözdizimi:
schtasks /create /tn "GörevAdı" /tr "Komut" /sc daily /st 03:00
Örnekler:
schtasks /create /tn "Gunluk Yedek" /tr "C:\scripts\yedek.bat" /sc daily /st 03:00
schtasks /create /tn "Saglik Kontrol" /tr "C:\scripts\kontrol.bat" /sc minute /mo 30
schtasks /create /tn "Haftalik Rapor" /tr "C:\scripts\rapor.bat" /sc weekly /d MON /st 09:00
schtasks /create /tn "Aylik Temizlik" /tr "C:\scripts\temizlik.bat" /sc monthly /d 1 /st 02:00
schtasks /create /tn "Baslangic Gorev" /tr "C:\scripts\baslat.bat" /sc onstart /ru SYSTEM
schtasks /query /fo TABLE
schtasks /query /tn "Gunluk Yedek" /v /fo LIST
schtasks /run /tn "Gunluk Yedek"
schtasks /change /tn "Gunluk Yedek" /disable
schtasks /delete /tn "Gunluk Yedek" /f
PowerShell ile Zamanlanmış Görev
$action = New-ScheduledTaskAction `
-Execute "PowerShell.exe" `
-Argument "-NoProfile -ExecutionPolicy Bypass -File C:\scripts\yedek.ps1" `
-WorkingDirectory "C:\scripts"
$trigger = New-ScheduledTaskTrigger -Daily -At 3am
$settings = New-ScheduledTaskSettingsSet `
-AllowStartIfOnBatteries `
-DontStopIfGoingOnBatteries `
-StartWhenAvailable
Register-ScheduledTask `
-TaskName "Gunluk Yedek" `
-Action $action `
-Trigger $trigger `
-Settings $settings `
-Description "Her gün 03:00 veritabanı yedeği" `
-User "SYSTEM" `
-RunLevel Highest
Get-ScheduledTask | Where-Object { $_.State -ne "Disabled" }
Start-ScheduledTask -TaskName "Gunluk Yedek"
Disable-ScheduledTask -TaskName "Gunluk Yedek"
Unregister-ScheduledTask -TaskName "Gunluk Yedek" -Confirm:$false
Cron İfadesini Windows'a Çevirme
| Cron | Anlam | schtasks |
|---|---|---|
*/5 * * * * | Her 5 dk | /sc minute /mo 5 /st 00:00 |
0 * * * * | Saat başı | /sc hourly /st 00:00 |
0 3 * * * | Her gün 03:00 | /sc daily /st 03:00 |
0 9 * * 1-5 | Hafta içi 09:00 | /sc weekly /d MON,TUE,WED,THU,FRI /st 09:00 |
0 0 1 * * | Ayın 1'i | /sc monthly /d 1 /st 00:00 |
@reboot | Açılış | /sc onstart |
WSL ile Gerçek Cron
Windows üzerinde Linux crontab istiyorsanız WSL kullanın:
sudo service cron start
crontab -e
WSL 2'de cron'un otomatik başlaması dağıtımın systemd ve servis ayarlarına bağlıdır. Systemd kullanılmayan Windows 11 / Server 2022 kurulumlarında /etc/wsl.conf:
[boot]
command="service cron start"
Alternatif: Task Scheduler'da açılış tetikleyicisi → eylem wsl -d Ubuntu -u root service cron start.
Gerçek Senaryolar
Senaryo 1: Günlük MySQL yedeği (batch)
Gece 03:00'te tek seferlik yedek alır; 30 günden eski dosyaları siler. Parolayı batch içinde düz metin tutmak risklidir — mümkünse MySQL option file veya Windows Credential Manager kullanın. SYSTEM hesabıyla çalıştırıyorsanız yedek dizininin SYSTEM'e yazılabilir olduğundan emin olun; aksi halde Last Run Result 0x1 görürsünüz.
@echo off
set TARIH=%date:~6,4%%date:~3,2%%date:~0,2%
set YEDEK_DIZIN=C:\Yedekler\DB
"C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqldump.exe" -u root -pSIFRE dbname > "%YEDEK_DIZIN%\yedek_%TARIH%.sql"
forfiles /p "%YEDEK_DIZIN%" /s /m *.sql /d -30 /c "cmd /c del @path"
schtasks /create /tn "DB Yedek" /tr "C:\scripts\db-yedek.bat" /sc daily /st 03:00 /ru SYSTEM
%date% biçimi yerel ayara bağlıdır; üretimde PowerShell Get-Date -Format 'yyyyMMdd' daha güvenilirdir. Görev Geçmişi'nde başarı kodu 0x0 görünse bile dosya boyutunu kontrol edin — boş dump sessiz hata olabilir.
Senaryo 2: Disk ve servis sağlığı (PowerShell, her 30 dk)
Disk doluluğu yüzde 90'ı aşınca loga yazar. Kritik Windows servislerini de aynı script'te Get-Service ile kontrol edebilirsiniz. Her 30 dakikada bir çalıştığı için e-posta spam'i yerine dosya logu tercih edin; eşik aşılırsa ayrı bir bildirim kanalı bağlayın.
$log = "C:\Loglar\saglik_$(Get-Date -Format 'yyyyMMdd').log"
Get-CimInstance Win32_LogicalDisk -Filter "DriveType=3" | ForEach-Object {
$pct = [math]::Round(($_.Size - $_.FreeSpace) / $_.Size * 100, 2)
if ($pct -gt 90) { "$(Get-Date) UYARI: $($_.DeviceID) %$pct" | Out-File $log -Append }
}
schtasks /create /tn "Saglik" /tr "PowerShell.exe -NoProfile -ExecutionPolicy Bypass -File C:\scripts\saglik.ps1" /sc minute /mo 30
Mapped network drive (Z:) SYSTEM altında görünmez. Ağ paylaşımı kullanıyorsanız UNC yolu (\\sunucu\paylasim) ve ağa erişebilen bir hesap seçin.
Sık Hatalar ve Çözümleri
1. Last Run Result 0x1 (veya 1)
Neden: Program/script hata kodu 1 ile çıktı — yanlış yol, eksik dosya, ExecutionPolicy.
Çözüm: Aynı komutu yönetici olmayan bir cmd'de çalıştırın; -ExecutionPolicy Bypass ve tam yolları doğrulayın.
2. 0x80070005 Access is denied
Neden: Yetki yetersiz veya “oturum açıkken” seçili hesap kapalı.
Çözüm: Yönetici olarak oluşturun; “oturum açmış olsun veya olmasın” + parola veya /ru SYSTEM.
3. Görev çalışıyor ama çıktı yok
Neden: Çalışma dizini System32; göreli path kırılıyor.
Çözüm: -WorkingDirectory veya batch'te cd /d C:\scripts; log'a >> C:\Loglar\cikti.log 2>&1.
4. PowerShell: script çalıştırma engellendi
Neden: ExecutionPolicy.
Çözüm:
PowerShell.exe -NoProfile -ExecutionPolicy Bypass -File "C:\scripts\gorev.ps1"
5. Bilgisayar uykudayken / kapalıyken kaçırma
Neden: Görev o anda çalıştırılamadı.
Çözüm: Start When Available; pil koşullarını gevşetin. Sunucu işi için makine kapalıysa aşağıdaki HTTP alternatifini kullanın.
cronjob.com.tr ile HTTP Tabanlı Alternatif
Windows makinesi kapalıyken yerel Task Scheduler çalışmaz. İşiniz genel HTTPS URL ise (ör. web uygulaması bakım ucu) cronjob.com.tr dışarıdan tetikler. Ücretsiz; kayıtta kredi kartı yok. En kısa aralık 1 dakika; GET/POST, özel header, Basic Auth.
<?php
declare(strict_types=1);
$beklenen = getenv('CRON_SECRET') ?: '';
$gelen = $_SERVER['HTTP_X_CRON_TOKEN'] ?? '';
if ($beklenen === '' || !hash_equals($beklenen, $gelen)) {
http_response_code(403);
exit('forbidden');
}
http_response_code(200);
echo 'ok';
Panelde URL, metot, X-Cron-Token ve zamanlamayı girin. Başarı: HTTP 200–399. Timeout aralığa göre (1 dk→55 sn; cron ifadeli→290 sn). Ardışık hata e-postası; loglar 7 gün. TLS doğrulanır; localhost/özel IP'ye istek atılmaz.
Sıkça Sorulan Sorular (SSS)
Windows'ta cron sözdizimi kullanabilir miyim?
Doğrudan hayır. Task Scheduler farklı bir model kullanır. WSL içinde gerçek Linux crontab çalıştırabilir veya schtasks ile eşdeğer zamanlamayı kurabilirsiniz.
Görev Zamanlayıcı mı Linux cron mu daha iyi?
Windows sunucu ve masaüstünde Task Scheduler; Linux sunucuda cron tercih edilmelidir. Windows olay/oturum tetikleyicileri sunar; cron tek satırlık yapılandırmayla öne çıkar.
WSL 2'de cron otomatik başlar mı?
Dağıtımın systemd ve servis ayarlarına bağlıdır. Systemd kullanılmayan Windows 11 / Server 2022 kurulumlarında /etc/wsl.conf içine [boot] altında command="service cron start" ekleyebilirsiniz; komut WSL örneği başlatıldığında çalışır.
Last Run Result 0x1 ne anlama gelir?
Görev başladı ama program çıkış kodu 1 döndü (script hatası, yanlış yol veya ExecutionPolicy). Aynı komutu cmd/PowerShell'de elle çalıştırıp hatayı görün.
Kullanıcı oturumu kapalıyken görev çalışır mı?
Evet, görevi "Kullanıcı oturum açmış olsun veya olmasın çalıştır" ve gerekirse SYSTEM veya kayıtlı parola ile yapılandırın. Ağa erişim için uygun hesap seçin.
Windows'ta güvenilir otomasyon: Create Task (basit sihirbaz değil), mutlak yollar, WorkingDirectory, Bypass ExecutionPolicy ve Last Run Result kontrolü demektir. Linux crontab alışkanlığı için WSL; makine kapalıyken tetiklenen web işleri için cronjob.com.tr kullanın. İlk çalıştırmayı her zaman schtasks /run veya Start-ScheduledTask ile elle doğrulayın.
Hemen Ücretsiz Cron Job Oluşturun
Ayrı bir sunucuda çalışan HTTPS bakım uç noktanızı cronjob.com.tr ile zamanlayıp yanıt kayıtlarını panelden inceleyin. Hizmet ücretsizdir; kayıtta kredi kartı istenmez.
Ücretsiz Başla →