Crontab Sözdizimi Cron İfadesi Referansı

ReferansYayın: Güncellendi: 11 dk okumaHazırlayan: cronjob.com.tr Editörleri

Crontab sözdizimi, bir komutun hangi dakikalarda, saatlerde ve tarihlerde çalıştırılacağını tanımlar. Beş alanlı bir cron ifadesi takvimi seçer; Linux crontab satırında bunun arkasına çalıştırılacak komut eklenir. Yanlış sıradaki iki sayı geçerli görünse bile işi beklemediğiniz saatte başlatabilir.

Bu referans, cron zaman formatını okumak ve kendi ifadenizi güvenle yazmak içindir. Alanları ve özel karakterleri öğrendikten sonra gerçek görev örnekleriyle ilerleyebilir, kaydetme hatalarını ve sessizce yanlış çalışan zamanlamaları ayırt edebilirsiniz. Zamanlayıcının görevini öğrenmek için önce cronjob başlangıç rehberine bakabilirsiniz.

Cron Zaman Formatı: Beş Alan ve Değer Aralıkları

Alanları soldan sağa okuyun: dakika, saat, ayın günü, ay, haftanın günü. Aralarında boşluk veya sekme bulunur; alan içindeki listelere boşluk konmaz. 30 14 * * * her gün 14:30'u seçer. İfadenin içinde saat dilimi veya çalıştırılacak dosya bilgisi yoktur.

# dakika saat ayın_günü ay haftanın_günü
30 14 * * *
# Kişisel crontab satırı: ifade + komut
30 14 * * * /usr/bin/php /var/www/site/rapor.php
AlanDeğerlerÖrnek yorum
Dakika0–5930: saatin 30. dakikası
Saat0–230: gece yarısı saati
Ayın günü1–3115: ayın 15. günü
Ay1–12 veya JAN–DEC6 veya JUN: haziran
Haftanın günü0–7 veya SUN–SAT1 veya MON: pazartesi

Bu sayfa Linux'ta yaygın Debian cron ve Cronie biçimini esas alır. Saniye veya yıl isteyen başka zamanlayıcıların ifadelerini doğrudan buraya taşımayın. Yerel uygulamanızın desteğini man 5 crontab ile kontrol edin; alan kuralları Debian crontab belgesinde de açıklanır.

Haftanın günleri tablosu ve ay adları

Değerİngilizce kısaltmaGün
0 veya 7SUNPazar
1MONPazartesi
2TUESalı
3WEDÇarşamba
4THUPerşembe
5FRICuma
6SATCumartesi

Ay adları JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC şeklindedir. Türkçe ay ve gün adları yazılmaz. Örneğin 0 9 * MAR-MAY MON-FRI mart–mayıs döneminde hafta içi 09:00'ı seçer. Farklı sistemlere taşınacak ifadelerde sayısal gösterim tercih etmek okumayı ve karşılaştırmayı kolaylaştırabilir.

Cron İfadesinde Özel Karakterleri Birlikte Kullanma

* alanın bütün geçerli değerlerini kapsar. 0 * * * * saat başlarını seçerken * * * * * her dakikayı seçer. Virgül ayrı değerleri birleştirir: saat alanındaki 9,12,18 yalnızca bu üç saattir. Tire uçları dahil aralık belirtir: 9-17, 09'dan 17'ye kadar tüm saatleri kapsar.

Bölü işareti aralık üzerinde adım seçer. 10-50/10 dakika alanında 10, 20, 30, 40 ve 50'dir; */15 ise 0, 15, 30 ve 45'tir. 1-23/2 tek saatleri, */2 saat alanında çift saatleri seçer. Adımın başlangıcını yazdığınız aralık belirler.

# Hafta içi 09:00–17:30 arasında, yarım saatte bir
*/30 9-17 * * 1-5
# Ayın 1'i ve 15'inde 09:00, 12:00 ve 18:00
0 9,12,18 1,15 * *
# Yaz aylarında hafta sonları 10:00–16:00 arasında saat başı
0 10-16 * 6-8 0,6
# Gece yarısını geçen saat aralığı: 22, 23, 0, 1, ... 6
0 22-23,0-6 * * *

İlk örneğin son çalışması 17:30'dur; saat aralığı 17'nin tüm seçilen dakikalarını kapsar. Tam 17:00'de bitmesi gerekiyorsa 09–16 saatlerini bir satırda, 17:00'yi ayrı satırda tanımlayın. Virgülden sonra eklenen boşluk yeni alan oluşturacağı için 9, 12 yazmayın.

Adım, geçen süre değildir: */35 * * * * her saatin 00 ve 35. dakikalarında çalışır; aradaki beklemeler 35 ve 25 dakikadır. 0 0 */5 * * ayın 1, 6, 11, 16, 21, 26 ve varsa 31. günlerini seçer. Ay sınırında sayım yeniden başladığından kesintisiz beş günlük süreyi ifade etmez.

Kaydetme anından itibaren sabit süre veya önceki işin bitişinden sonra bekleme istiyorsanız, takvim seçimi yerine bu davranışı destekleyen bir zamanlayıcı gerekir. Adımın alan içinde değerlendirildiği kuralı Cronie sözdizimi belgesinde açıklanır.

Ayın Günü, Haftanın Günü ve Takvim Sınırları

Dakika, saat ve ay eşleşmelidir. Ayın günü ile haftanın günü açık değerlerle birlikte sınırlandığında ise VEYA uygulanır: 0 9 1 * 1 ayın 1'lerinde ve bütün pazartesilerde 09:00'da çalışır. “Ayın 1'i pazartesiye denk gelirse” anlamına gelmez. Alanlardan biri * ise diğer gün alanı takvimi sınırlar.

Ayın ilk pazartesisi için her pazartesi çalışıp betikte günün 7 veya daha küçük olduğunu sınayabilirsiniz. Aşağıdaki Linux örneğinde tarih komutundaki yüzde işareti crontab için kaçırılmıştır. Daha karmaşık takvim mantığını ayrı betikte tutmak denetlemeyi kolaylaştırır.

# Ayın ilk Pazartesi günü 09:00
0 9 * * 1 [ "$(date +\%d)" -le 7 ] && /usr/bin/php /var/www/site/aylik-rapor.php

0 0 31 * * yalnızca 31 gün çeken aylarda eşleşir; ayın son günü değildir. 0 0 31 2 * ise hiç eşleşmez. Çeyrek sonunun son iş gününü bulmak için 28-31 aralığı yeterli olmaz; birden fazla gün seçer ve tatilleri bilmez. Son gün veya iş günü hesabını uygulama takviminde yapın.

Saat dilimi değişince ifadenin temsil ettiği gerçek an da değişir. Yaz saati geçişi kullanan bölgelerde atlanan veya tekrarlanan yerel saatlerin davranışı cron uygulamasına bağlıdır. Kritik bir işte hem seçilen bölgeyi hem ilgili zamanlayıcının geçiş politikasını doğrulayın; yalnızca bir sonraki çalışmaya bakmak yeterli değildir.

En Çok Kullanılan Cron İfadeleri

Aşağıdaki ifadeler yalnızca zaman alanlarıdır. Linux'ta sonlarına komut eklenir; HTTP zamanlama panelinde ise URL ve metot ayrı girilir. Hepsi görev için geçerli saat diliminde yorumlanır.

İfadeÇalışma zamanıÖrnek ihtiyaç
* * * * *Her dakikaKısa durum kontrolü
*/5 * * * *Her 5 dakikaÖnbellek yenileme
*/15 * * * *Her 15 dakikaStok eşitleme
*/30 * * * *00 ve 30. dakikalardaAra rapor
0 * * * *Her saat başıSaatlik özet
0 */2 * * *00:00'dan başlayarak çift saatlerdeVeri aktarımı
0 */6 * * *00:00, 06:00, 12:00, 18:00Sitemap üretme
0 0 * * *Her gün 00:00Günlük kayıt
0 3 * * *Her gün 03:00Yedekleme
0 9 * * 1-5Hafta içi 09:00İş günü raporu
0 9,18 * * *Her gün 09:00 ve 18:00Günde iki kontrol
0 0 * * 0Pazar 00:00Haftalık arşiv
0 0 1 * *Ayın 1'i 00:00Aylık özet
0 0 1 1 *1 Ocak 00:00Yıllık rapor

Takvimi kopyaladıktan sonra işin normal süresini de ölçün. On dakika süren bir betiği beş dakikada bir başlatmak çakışma yaratabilir; geçerli ifade bu sorunu engellemez. Farklı ihtiyaçlar için crontab örnekleri rehberinden, tek sayfalık özet için crontab kopya kağıdından yararlanabilirsiniz.

Önceden Tanımlı Kısayollar

Kısayol beş zaman alanının yerine geçer; yanına ayrıca beş alan yazılmaz. Yaygın Linux uygulamalarındaki karşılıkları şöyledir. Başka bir hizmete aktarırken desteklenen kısayolları ayrıca kontrol edin.

@hourly    # 0 * * * *
@daily     # 0 0 * * *
@midnight  # @daily ile aynı
@weekly    # 0 0 * * 0
@monthly   # 0 0 1 * *
@yearly    # 0 0 1 1 *
@annually  # @yearly ile aynı
@reboot    # Cron servisi başlangıcında; takvim karşılığı yok

@daily /usr/bin/php /var/www/site/gunluk-rapor.php

@daily kaydettiğiniz andan 24 saat sonrasını değil gece yarısını seçer. @reboot ağın veya veritabanının hazır olacağını garanti etmez. Başka servislere bağımlı bir uygulamayı kalıcı servis yöneticisiyle başlatmak daha uygun olabilir; bu kısayolu uygulama gözetimi yerine kullanmayın.

Adım Adım İfade Oluşturma ve Gerçek Senaryolar

  1. İhtiyacı cümleyle yazın. Örneğin “hafta içi 09:30'da satış raporu” ifadesinde dakika 30, saat 9, hafta günü 1–5'tir; diğer alanlar yıldızdır.
  2. Beş alanı oluşturun. Cron ifadesi oluşturucu ile hazırlayın veya elle yazın. Açıklamayı Türkçe cron açıklayıcıda karşılaştırın.
  3. Komutu ayrıca sınayın. Dosya yolu, çalışma dizini, ortam ve izinleri görevi çalıştıracak kullanıcıyla doğrulayın. Bir ifade aracı betiğin başarısını kontrol etmez.
  4. Kaydedin ve gözleyin. crontab -e içinde mevcut görevleri koruyarak satırı ekleyin; sonuna yeni satır koyun. crontab -l kayıtlı tanımı gösterir, çalıştığını kanıtlamaz.

İş günü satış raporu

Raporu hafta içi 09:30'a almak, ekip başlamadan önceki kayıtların toparlanmasına zaman bırakır. PHP betiğini önceden hazırlayın; yorumlayıcı yolunu command -v php ile doğrulayın ve log dizinini oluşturun. Hafta içi seçimi resmi tatilleri dışlamaz; gerekiyorsa betik içinde iş takvimi kontrolü ekleyin.

# Terminalde
mkdir -p "$HOME/cron-logs"
/usr/bin/php /var/www/site/satis-raporu.php
crontab -e
# Crontab'a eklenecek satır
30 9 * * 1-5 /usr/bin/php /var/www/site/satis-raporu.php >> "$HOME/cron-logs/satis.log" 2>&1

Gece dosya yedeği

Her gün 03:00'te dosya arşivi almak için aşağıdaki satırı kullanabilirsiniz. Kaynak dizin ve hedef klasör size ait olmalı; sisteminizde tar yolunu doğrulamalısınız. Bu yöntem canlı veritabanının tutarlı yedeğini sağlamaz. Arşivin açılabildiğini test etmek zamanlamayı doğrulamak kadar önemlidir.

# Terminalde hedefi hazırlayın
mkdir -p "$HOME/backups"
# Crontab içinde
0 3 * * * /usr/bin/tar -czf "$HOME/backups/site-$(date +\%F).tar.gz" -C /var/www/site public >> "$HOME/cron-logs/yedek.log" 2>&1

Kullanıcı Crontab'ı, Sistem Dosyası ve Ortam

crontab -e ile açılan kişisel listede kullanıcı adı alanı yoktur. /etc/crontab ve /etc/cron.d/ dosyalarında beş zaman alanından sonra kullanıcı adı gelir. Kişisel listeye sistem satırını aynen yapıştırmak komutun kullanıcı adından başlamasına yol açar.

# Kişisel crontab
0 3 * * * /usr/bin/php /var/www/site/rapor.php
# /etc/crontab; www-data sistemde bulunan bir kullanıcı olmalıdır
0 3 * * * www-data /usr/bin/php /var/www/site/rapor.php

Ortam değişkenlerini ayrı satırda tanımlayın. Etkileşimli kabuğun profil dosyalarının yükleneceğini varsaymayın. MAILTO çıktının gönderileceği adresi seçer; posta tesliminin çalışması ayrıca sistem yapılandırmasına bağlıdır. Crontab ortam atamalarında PATH=$HOME/bin:$PATH gibi kabuk genişletmelerine güvenmeyin; açık yollar yazın.

SHELL=/bin/sh
PATH=/usr/local/bin:/usr/bin:/bin
MAILTO=operator@example.com

Cronie'deki CRON_TZ gibi saat dilimi ayarları her cron uygulamasında aynı biçimde desteklenmez. Kurulu uygulamanın belgesini kontrol edin. Betiğe yalnızca TZ vermek komutun tarih çıktısını etkileyebilir; zamanlayıcının hangi saate göre eşleştirdiğini ayrıca doğrulamak gerekir.

Sık Sözdizimi Hataları ve Çözümleri

bad minute veya bad hour

Dakikada 60, saatte 24 gibi aralık dışı bir sayı, alan kayması veya sıfır adım kayıt sırasında hata verebilir. Linux cron uygulamalarında bad minute ve bad hour mesajları görülebilir; tam biçim sürüme bağlıdır. Alan sayısını ve aralıkları düzeltin. Her dakika için */0 yerine * kullanın.

Kaydoluyor ama yanlış saatte çalışıyor

3 0 * * * geçerlidir ve 00:03'tür. 03:00 için 0 3 * * * gerekir. Sunucunun saati ile beklediğiniz bölgenin saatini karşılaştırın. Hafta içi ve ayın günü alanlarının birlikte sınırlandığı satırlarda VEYA kuralını da kontrol edin.

Yüzde işareti komutu bölüyor

Komut bölümündeki kaçırılmamış % yeni satıra çevrilir; ilk yüzdeden sonraki bölüm komuta standart girdi olarak gönderilir. Kabuk tırnakları bunu engellemez. Tarih biçiminde \% kullanın veya tarih komutunu ayrı betiğe taşıyın. Aşağıdaki kaçış yalnızca crontab satırı içindir.

0 3 * * * /usr/bin/date +\%F > "$HOME/cron-logs/tarih.txt" 2>&1

php: not found veya Permission denied

Bu mesajlar takvim hatası değildir; komut başlatma veya dosya erişimi sorunudur. Yorumlayıcının mutlak yolunu yazın, kullanıcıyı ve çıktı dizinindeki izinleri kontrol edin. Hatayı görmek için standart hata çıktısını loga alın. Detaylı inceleme için cron job çalışmıyor rehberini kullanabilirsiniz.

Son satır gözden kaçıyor veya tarih hiç gelmiyor

Son görev satırını yeni satır karakteriyle bitirin; bazı uygulamalar eksikliğini geçersiz tablo olarak değerlendirir. Ayrıca 31 2 gibi gerçekleşmeyen takvim eşleşmelerini kontrol edin. Söz diziminin kabul edilmesi gelecekte mutlaka bir çalışma zamanı bulunduğu anlamına gelmez.

cronjob.com.tr ile Cron İfadesini HTTP İşine Uygulama

Bir URL ile tetiklenebilen rapor için panelde komut yazmadan aynı beş alanlı zamanlamayı kullanabilirsiniz. Uç nokta örneği https://example.com/jobs/rapor olsun. Aşağıdaki PHP korumasını kendi uygulamanıza uyarlayın; CRON_TOKEN web uygulamasının sunucu ortamında güçlü bir gizli değer olmalı, çağrılan rapor dosyası gerçekten bulunmalıdır.

<?php
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    http_response_code(405);
    exit;
}
$expected = getenv('CRON_TOKEN');
$provided = $_SERVER['HTTP_X_CRON_TOKEN'] ?? '';
if (!$expected || !hash_equals($expected, $provided)) {
    http_response_code(403);
    exit;
}
require '/srv/app/jobs/rapor.php';
http_response_code(204);

Rapor betiği hata durumunda uygun hata yanıtı üretmeli; başarılı görünmek için her koşulda 204 döndürmemelidir. HTTPS kullanın ve token'ı URL'ye koymayın. Dışarıdan HTTP erişimi olmayan bir yerel komut için sunucu içindeki zamanlayıcıyı kullanın.

  1. İş URL'sini ve POST metodunu girin; özel header olarak X-Cron-Token ile aynı gizli değeri ekleyin.
  2. Cron ifadesi alanına hafta içi rapor için 30 9 * * 1-5 yazın; Linux komutunu bu alana eklemeyin. Hazır aralık seçeneği de kullanılabilir.
  3. İşin saat dilimini seçin; varsayılan Europe/Istanbul'dur. Manuel çalıştırıp yanıt ve uygulama sonucunu doğrulayın.

Hizmet ücretsizdir ve kayıtta kredi kartı istenmez. En kısa aralık 60 saniyedir. Cron ifadeli işte yanıt bekleme sınırı 290 saniyedir; hazır aralıkta aralık eksi 5 saniye, en az 5 ve en fazla 290 saniye uygulanır. Bir dakikalık hazır aralık 55, iki dakikalık 115 saniye bekler.

HTTP 200–399 ve bağlantı hatası olmaması başarı sayılır; bu, rapor verisinin doğru olduğunu tek başına kanıtlamaz. Ardışık hata eşiği varsayılan 3, ayarlanabilir aralık 1–20'dir. Eşik aşılınca erişim sorunu, düzelince kesinti süresiyle düzeldi e-postası gönderilir; aynı işte bildirimler arasında en az 60 dakika bulunur. Çalışma kayıtları 7 gün tutulur.

Sıkça Sorulan Sorular (SSS)

0 ve * arasındaki fark nedir?

0 belirli bir değeri, * alanın bütün geçerli değerlerini seçer. Dakika alanında 0 saat başını seçer; * ise her dakikadır. Bu nedenle 0 * * * * saatte bir, * * * * * dakikada bir çalışır.

*/1 ile * arasındaki fark nedir?

Bu biçimde ikisi de ilgili alanın bütün değerlerini seçer. Dakika alanında */1 ile * aynı dakikaları eşleştirir; daha sade gösterim için yıldız kullanılabilir.

Crontab'da saniye veya yıl belirtebilir miyim?

Standart beş alanlı crontab biçiminde saniye ve yıl alanı yoktur. Yıl koşulu gerekiyorsa betikte kontrol edin; saniyelik zamanlama için bu özelliği destekleyen başka bir zamanlayıcı seçin.

Crontab sözdizimini test etmenin en kolay yolu nedir?

İfadeyi önce Türkçe açıklamasıyla karşılaştırın, sonra crontab -e ile kaydederken verilen sözdizimi uyarılarını değerlendirin. Takvimin doğru olması komutun çalıştığını göstermez; komutu elle ve görev günlüğüyle ayrıca doğrulayın.

Her ayın son günü için 31 yazmak yeterli mi?

Hayır. 31 yalnızca o günü bulunan aylarda eşleşir. Her gün çalışan bir betikte ertesi günün yeni ay olup olmadığını kontrol edebilir veya takvim hesabını destekleyen bir zamanlayıcı kullanabilirsiniz.

Cron ifadesinde soru işareti, L veya # kullanılabilir mi?

Bu karakterler burada anlatılan klasik beş alanlı Linux cron biçiminin parçası değildir. Başka zamanlayıcıların uzantılarını taşımadan önce hedef uygulamanın belgelerini kontrol edin.

Hemen Ücretsiz Cron Job Oluşturun

HTTP işinizi hazır aralık veya beş alanlı cron ifadesiyle zamanlayın. Ücretsiz kayıtta kredi kartı istenmez.

Ücretsiz Başla →

İlgili Rehberler