Ana Sayfa / Ücretsiz Araçlar / Cron Job İfadesi Oluşturucu
DevOps & Sistem

Cron Job (Crontab) Zamanlama İfadesi Oluşturucu & Türkçe Açıklayıcı

Linux crontab zamanlanmış görevlerini (* * * * *) dakika, saat, gün, ay ve hafta günü olarak görsel seçicilerle oluşturun ve mevcut cron ifadelerinin ne zaman çalışacağını Türkçe okuyun.

Zamanlama Ayarları
Crontab İfadesi & Türkçe Açıklaması
Oluşturulan Cron İfadesi
0 9 * * 1-5
TÜRKÇE ANLAMI:
Hafta içi her gün (Pazartesi - Cuma) saat 09:00'da çalışır.

Linux Crontab Nedir? POSIX, Vixie Cron Mimarisi ve Çalışma Prensibi

Unix ve Linux ekosisteminin en temel zamanlama altyapısı olan Cron, sistem yöneticilerinin ve yazılım geliştiricilerin komut dosyalarını (shell script), konsol komutlarını (PHP CLI, Python, Node.js) ve rutin bakım işlemlerini belirli zaman dilimlerinde veya periyodik aralıklarla arka planda otomatik olarak yürütmesini sağlayan bir zamanlama servisidir (daemon). İlk olarak 1970'li yıllarda Bell Laboratuvarları'nda Unix Version 7 ile ortaya çıkan bu yapı, 1987 yılında Paul Vixie tarafından geliştirilen ve bugün Debian, Ubuntu, CentOS, RHEL, Fedora ve Alpine gibi dağıtımların çekirdeğinde yer alan Vixie Cron implementasyonu ile endüstri standardı (POSIX IEEE Std 1003.1) haline gelmiştir.

Linux işletim sisteminde arka planda kesintisiz çalışan crond (veya cron) servisi, her dakikanın ilk saniyesinde (00. saniye) uyanarak /etc/crontab, /etc/cron.d/ ve kullanıcıya özel /var/spool/cron/crontabs/ dizinlerindeki tabloları stat() sistem çağrısıyla denetler. Dosyaların son değiştirilme zaman damgasında (mtime) veya inode yapısında bir değişiklik varsa tabloları belleğe yeniden yükler; aksi takdirde mevcut zaman damgasıyla eşleşen satırları tespit ederek her bir görev için işletim sistemi düzeyinde yeni bir alt süreç (child process) çatallar (fork + execve).

Crontab 5 Alanlı Zamanlama Anatomisi (POSIX Standardı)
*     *     *     *     *     [komut]
│     │     │     │     └─ Haftanın Günü: 0 - 7 (0 ve 7 = Pazar, 1 = Pazartesi ... 6 = Cumartesi veya SUN-SAT)
│     │     │     └────── Ay: 1 - 12 (1 = Ocak, 12 = Aralık veya JAN-DEC)
│     │     └─────────── Ayın Günü: 1 - 31 (Ayın takvim günü)
│     └──────────────── Saat: 0 - 23 (24 saatlik format; 0 = gece yarısı, 23 = 23:00)
└───────────────────── Dakika: 0 - 59 (Saatin içindeki dakika)

Kullanıcı Crontab'ı ile Sistem Crontab'ı Arasındaki Mimari Farklar

Linux altyapısında iki farklı düzeyde crontab yapılandırması bulunur:

  • Kullanıcı Crontab'ı (User Crontab): Terminalde crontab -e komutu ile düzenlenir ve /var/spool/cron/crontabs/<kullanici> altında izole olarak saklanır. Bu satırlar yalnızca 5 zaman alanı ve yürütülecek komuttan oluşur. Komut, o crontab'ın sahibi olan Linux kullanıcısının yetkileriyle (UID/GID) çalıştırılır.
  • Sistem Crontab'ı (System Crontab): /etc/crontab dosyasında ve /etc/cron.d/ altındaki modüler dosyalarda yer alır. Sistem düzeyindeki dosyalarda 5 zaman alanının hemen ardından 6. sütun olarak kullanıcı adı (user) belirtilmesi zorunludur: 0 3 * * * root /usr/local/bin/backup.sh. Kullanıcı alanı atlanırsa crontab komut adını kullanıcı zannederek sözdizimi hatası verir.

Crontab Sözdiziminde Kullanılan Özel Karakterler ve Mantıksal Operatörler

Karakter Tanım & Operatör Mantığı Örnek İfade Çalışma Zamanı
* (Joker / Wildcard) İlgili alanın kapsadığı tüm olası değerleri (dakika için 0-59, saat için 0-23) kabul eder. * * * * * Her dakikanın başında kesintisiz.
, (Virgül / Liste) Aynı alanda virgülle ayrılmış birden fazla ayrık değeri tanımlar. 15,45 * * * * Her saatin 15. ve 45. dakikalarında.
- (Tire / Aralık) İki sınır değer arasındaki tüm ardışık tam sayıları kapsar (kapalı aralık). 0 9-18 * * 1-5 Pazartesi-Cuma arası her gün saat 09:00'dan 18:00'e kadar saat başı.
/ (Bölü / Adım Değeri) Belirtilen aralık içinde belirli bir artış sıklığı (step) tanımlar. */10 * * * * 0, 10, 20, 30, 40, 50. dakikalarda (her 10 dakikada bir).
Kombinasyon (-, /) Aralık ve adım değerini birleştirerek kısıtlı saat penceresinde sıklık kurar. 0/15 8-17 * * * 08:00 - 17:00 saatleri arasında her 15 dakikada bir.

Standart Vixie Cron Ön Tanımlı Kısayolları (Macro Strings)

Sayısal sözdizimini yazmak yerine crontab dosyasında okunabilirliği artırmak için Vixie Cron tarafından sunulan hazır makro takma adları kullanılabilir:

@reboot
Sunucu yeniden başladığında (crond başlatıldığında) arka planda 1 kez çalışır.
@daily / @midnight
0 0 * * * eşdeğeridir. Her gece yarısı saat tam 00:00'da çalışır.
@hourly
0 * * * * eşdeğeridir. Her saatin ilk dakikasında (00. dakika) çalışır.
@weekly
0 0 * * 0 eşdeğeridir. Her Pazar gecesi saat 00:00'da tetiklenir.
@monthly
0 0 1 * * eşdeğeridir. Her ayın 1. günü gece saat 00:00'da tetiklenir.
@yearly / @annually
0 0 1 1 * eşdeğeridir. Her yılın 1 Ocak gecesi 00:00'da bir kez çalışır.

Linux Cron vs Quartz, Spring Scheduler ve AWS EventBridge Farkları

Farklı framework ve bulut platformları cron kavramını genişletmiştir. Standart Linux crontab ile modern uygulama zamanlayıcıları arasındaki sözdizimi farklarına dikkat edilmelidir:

  • Saniye Hassasiyeti (6-7 Alan): Quartz Scheduler ve Spring Framework cron ifadelerinde ilk alan olarak Saniye (0-59) eklenir (toplam 6 alan). AWS EventBridge ise opsiyonel olarak yıl alanını da kabul eder. Standart Linux Vixie Cron'unda 6 alan yazılırsa komut 6. alanı dosya adı sanır ve hata verir.
  • Soru İşareti (?) Operatörü: Quartz ve AWS'de, ayın günü ile haftanın günü arasında çakışmayı önlemek için "belirli bir değer yok" anlamında ? karakteri kullanılır. Linux crontab '?' karakterini desteklemez; syntax error üretir!
  • Özel Tarih Belirteçleri (L, W, #): Quartz'da L (Last = son gün), 15W (15. güne en yakın iş günü), 5#3 (ayın 3. Cuması) gibi operatörler bulunur. Standart Linux cron bu hesaplamaları desteklemez; Linux üzerinde benzer ihtiyaçlar için shell komutunda date veya harici script kontrolleri yapılmalıdır.

Zamanlama Teknolojileri Karşılaştırma Matrisi

Modern yazılım mimarilerinde periyodik ve asenkron görevlerin yönetimi için kullanılan 4 temel yaklaşımın teknik yetenekleri ve mimari sınırları:

Teknoloji / Mimari Zaman Çözünürlüğü Durum Takibi & Kuyruk Çakışma Önleme (Locking) Hata Yeniden Deneme (Retry) İdeal Kullanım Alanı
Linux Crontab (Vixie) 1 Dakika (60 sn) Yok (Stateless) Manuel (flock gerekir) Yok (Exit code sadece) Sunucu bakım scriptleri, log rotasyonu, basit yedeklemeler.
Systemd Timers (.timer) 1 Milisaniye / Saniye Var (Systemd State) Yerleşik (RefuseManual) Persistent=true (Kaçırılanı yapar) Cgroups ile RAM/CPU limitli görevler, modern Linux servisleri.
Dağıtık Kuyruklar (Celery, BullMQ) Milisaniye (Event-driven) Gelişmiş (Redis/RabbitMQ) Dağıtık Mutex (Redlock) Exponential Backoff / DLQ E-ticaret sipariş işleme, toplu SMS/e-posta gönderimi, webhooks.
Cloud Scheduler (AWS / GCP) 1 Dakika Tam Yönetilen (CloudWatch) Altyapı Düzeyinde Otomatik Retry & DLQ Entegre Serverless Lambda fonksiyonları, Cloud Run, çok bölgeli mimariler.

Gerçek Dünya Senaryoları & Uygulamalı Vaka Analizleri

Vaka 1: Yüksek Trafikli E-Ticaret Platformunda Stok Senkronizasyonunun Çakışmasını (Overlap) Önleme

Senaryo & Problem: 85.000 aktif ürün stoğuna sahip bir e-ticaret sitesi, ERP API'sinden güncel stok ve fiyat verilerini çekmek için her dakikada bir çalışan bir PHP CLI cron görevi tanımlamıştır: * * * * * /usr/bin/php /var/www/artisan stock:sync. Cuma günü kampanya esnasında ERP sunucusu aşırı yük nedeniyle yavaşlamış ve normalde 20 saniye süren senkronizasyon işlemi 85 saniyeye uzamıştır. Standart cron bir önceki görevin bitip bitmediğini denetlemediği için her dakikanın başında yeni bir PHP süreci başlatmıştır. 5 dakika içinde sunucuda eşzamanlı çalışan 6 adet stok güncelleme süreci oluşmuş; MySQL veritabanında Lock wait timeout exceeded ve deadlock patlaması yaşanmış, sunucu CPU kullanımı %100'e fırlamış ve ana web sitesi kullanıcılara 504 Gateway Timeout hatası vermeye başlamıştır.

Uygulanan Çözüm: Linux util-linux paketinin sağladığı flock dosya kilitleme mekanizması devreye alınmıştır. Kilitleme bayrağı -n (non-blocking) olarak ayarlanarak, bir önceki görev hala devam ediyorsa yeni dakikadaki sürecin beklemeden ve hata fırlatmadan sessizce sonlanması sağlanmıştır:

# Crontab Tanımı (Overlap Korumalı & Bellek Limitli)
* * * * * /usr/bin/flock -n /var/run/stock_sync.lock -c "/usr/bin/php -d memory_limit=512M /var/www/html/artisan stock:sync >> /var/log/cron_stock.log 2>&1"

Teknik Sonuç: ERP API'si gecikse dahi sunucuda aynı anda yalnızca tek bir senkronizasyon süreci çalışabilmektedir. Çakışma girişimi olduğunda flock kilit dosyasını kontrol etmiş, yeni görevi 0 milisaniyede sonlandırarak CPU ve RAM tüketimini sıfırda tutmuştur. Deadlock oluşumu tamamen engellenmiş ve web sitesi kesintisiz hizmet vermeye devam etmiştir.

Vaka 2: Büyük Ölçekli PostgreSQL / MySQL Veritabanı Yedeği, S3 Yüklemesi ve Slack Hata Alarmı

Senaryo & Problem: 60 GB boyutunda işlem geçmişi barındıran bir SaaS veritabanı her gece saat 02:30'da yedeklenmektedir. Başlangıçta yazılan basit cron komutu (30 2 * * * mysqldump -u root db > /backup/db.sql), dump esnasında sunucunun disk I/O kapasitesini tüketmiş ve gece saatlerinde çalışan faturalandırma işlemlerini durma noktasına getirmiştir. Daha da kötüsü, sunucu diski dolduğunda dump işlemi yarım kalmış fakat exit code denetlenmediği için yönetim ekibi yedeğin alındığını varsaymıştır.

Uygulanan Çözüm: Veritabanı yedeği, diskte yer kaplamadan doğrudan boru hattı (pipeline) ile RAM üzerinden sıkıştırılarak AWS S3 bulut depolamaya aktarılmış; CPU ve Disk I/O önceliği nice ve ionice araçlarıyla minimum seviyeye çekilmiştir. Ayrıca mantıksal || operatörüyle komut başarısız olduğunda anında Slack DevOps kanalına webhook bildirimi gönderen bir akış kurulmuştur:

# Crontab Tanımı: Düşük I/O Önceliği, Doğrudan S3 Streaming ve Slack Alert
30 2 * * * nice -n 19 ionice -c 3 mysqldump --single-transaction --quick -u admin -p'SECRET' saas_db | gzip -9 | aws s3 cp - s3://inovoice-prod-backups/db_$(date +\%F_\%H\%M).sql.gz > /var/log/backup.log 2>&1 || curl -s -X POST -H 'Content-type: application/json' --data '{"text":"🚨 HATA: Gece veritabanı yedeği başarısız oldu!"}' https://hooks.slack.com/services/T00/B00/X00

Teknik Sonuç: ionice -c 3 (Idle class) sayesinde yedekleme işlemi canlı veritabanı trafiğine hiçbir I/O yükü getirmemiştir. S3'e doğrudan aktarım yerel diskte 60 GB boş alan tutma zorunluluğunu ortadan kaldırmış; olası bir network kesintisi veya dump hatasında nöbetçi mühendislere 5 saniye içinde Slack uyarısı iletilmesi sağlanmıştır.

Crontab Yapılandırmasında Sık Yapılan 6 Kritik Hata ve Çözüm Kontrol Listesi

Hata Tipi Görülen Semptom & Risk Yanlış Kullanım Doğru & Güvenli Yaklaşım
1. PATH Eksikliği Terminalde çalışan komut cron'da "command not found" hatası verir. 0 * * * * php artisan test 0 * * * * /usr/bin/php /var/www/artisan test
2. Lock Mekanizmasızlık Geciken görevler üst üste biner, CPU %100 olur ve veritabanı kilitlenir. * * * * * python sync.py * * * * * flock -n /tmp/sync.lck python sync.py
3. Çıktı / Log Başıboşluğu Sunucuda MTA yoksa çıktılar yok olur; varsa /var/spool/mail şişerek diski doldurur. 0 0 * * * /backup.sh 0 0 * * * /backup.sh >> /var/log/b.log 2>&1
4. DOM & DOW OR Mantığı Hem ay günü hem hafta günü girildiğinde AND değil OR çalışır; görev beklenenden sık tetiklenir. 0 0 15 * 1 (15'i Pazartesi zannedilir) 0 0 15 * * [ $(date +\%u) -eq 1 ] && komut
5. Timezone & DST İhmali Sunucu UTC çalışırken yerel saate göre planlanan görevler 3 saat erken veya geç başlar. 0 9 * * * (Sunucu UTC iken TR 12:00'ye denk gelir) Crontab başına CRON_TZ=Europe/Istanbul ekleyin.
6. % Karakteri Kaçışsızlığı Cron `%` işaretini yeni satır (newline) sayar; `date +%Y` komutları sessizce kırılır. 0 0 * * * tar -czf backup-$(date +%F).tar.gz 0 0 * * * tar -czf backup-$(date +\%F).tar.gz

Sıkça Sorulan Sorular

Crontab sözdizimindeki 5 alan (dakika, saat, gün, ay, hafta) nasıl yorumlanır ve özel karakterler ne işe yarar?
Standart POSIX / Vixie cron ifadesi 5 ardışık alandan oluşur: Dakika (0-59), Saat (0-23), Ayın Günü (1-31), Ay (1-12) ve Haftanın Günü (0-7, 0 ve 7 ikisi de Pazar). Özel karakterlerden * her değeri, virgül (,) çoklu değer listesini (örn. 10,20), tire (-) kapalı aralığı (örn. 1-5), eğik çizgi (/) ise adım aralığını (örn. */15 = her 15 dakikada bir) ifade eder.
Cron ortamında (environment) komutların 'command not found' hatası vermesinin sebebi nedir ve nasıl çözülür?
Crontab görevleri kullanıcının interaktif login kabuğundan (bash/zsh) farklı olarak minimal bir ortam değişkeniyle (PATH=/usr/bin:/bin) çalışır. Bu nedenle /usr/local/bin, /home/user/.nvm veya özel PHP/Node yolları otomatik olarak yüklenmez. Çözüm için: 1) Komutlarda /usr/bin/php gibi mutlak (absolute) ikili dosya yolları kullanılmalı, 2) Crontab dosyasının en üst satırına genişletilmiş PATH tanımı eklenmeli veya 3) Görev 'bash -lc komut' şeklinde interaktif login ortamında çalıştırılmalıdır.
Uzun süren cron görevlerinin üst üste binmesini (overlapping) engellemek için flock nasıl kullanılır?
Cron bir önceki görevin tamamlanıp tamamlanmadığını denetlemez; zamanı gelince yeni bir işlem (process) çatallar (fork). Ağır görevlerde CPU ve bellek kilitlenmesini önlemek için Linux util-linux paketindeki flock aracı kullanılır. Örnek: '* * * * * /usr/bin/flock -n /var/run/gorev.lock /usr/bin/php /var/www/script.php >> /var/log/gorev.log 2>&1'. Buradaki -n (non-blocking) bayrağı, kilit dosyası başka bir işlem tarafından tutuluyorsa yeni görevi kuyruğa almadan sessizce sonlandırır.
Crontab'da ayın günü (DOM) ile haftanın günü (DOW) aynı anda tanımlandığında mantık (AND/OR) nasıl işler?
Standart Vixie cron spesifikasyonuna göre, eğer hem Ayın Günü (3. alan) hem de Haftanın Günü (5. alan) yıldız (*) dışında spesifik bir değerle kısıtlanmışsa, bu iki koşul mantıksal AND yerine mantıksal OR ile birleştirilir. Örneğin '0 0 15 * 1' ifadesi 'yalnızca Pazartesi olan ayın 15'lerinde' DEĞİL; 'ayın her 15. gününde VEYA her Pazartesi gününde' tetiklenir. Yalnızca ayın 15'i Pazartesi ise çalıştırmak için komut içinde shell kontrolü yapılmalıdır.
Linux crontab ile modern Systemd Timer servisleri arasındaki temel farklar nelerdir?
Crontab dakikalık çözünürlükle çalışan basit, hafif ve taşınabilir bir zamanlayıcıdır; ancak process monitoring, cgroups ile kaynak (CPU/RAM) sınırlama, servis bağımlılıkları ve milisaniye hassasiyeti sunmaz. Systemd Timer'lar ise .timer ve .service çiftiyle çalışır; kaçırılan görevleri sunucu açılışında telafi etme (Persistent=true), journalctl ile merkezi loglama, MemoryMax ile bellek kısıtlama ve dinamik bağımlılık yönetimi sağlar. Mikroservisler ve kritik altyapılarda Systemd Timer veya Kubernetes CronJob önerilir.
Cron job çıktıları, loglama ve hata durumunda bildirim (Slack, E-posta) entegrasyonu nasıl kurulmalıdır?
Cron çıktıları varsayılan olarak yerel mail (MTA) servisine gider. Loglama için stdout ve stderr dosyalara yönlendirilmelidir: 'komut >> /var/log/app.log 2>&1'. Hata durumunda (exit code != 0) anlık bildirim almak için mantıksal zincirleme kullanılabilir: '/usr/bin/php /app/cron.php >> /var/log/app.log 2>&1 || curl -X POST -H 'Content-type: application/json' --data '{\"text\":\"Sunucu Cron Hatası: script.php başarısız oldu!\"}' $SLACK_WEBHOOK_URL'.

Kritik Sunucu Görevleriniz & DevOps Altyapınız Güvende mi?

Inovoice olarak kurumsal Linux sunucu optimizasyonu, otomatik yedekleme sistemleri, Redis/RabbitMQ asenkron kuyruk mimarileri ve 7/24 kesintisiz yüksek erişilebilirlik (HA) çözümleri sunuyoruz.

Teklif Alın

Projenizi Anlatın

Fikirlerinizi gerçeğe dönüştürmek için ilk adımı atın. Uzman ekibimiz hemen dönüş yapsın.

Talebiniz başarıyla alındı.
Size en kısa sürede ulaşacağız.
Hemen Ara WhatsApp Teklif Al