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
| Alan | Değerler | Örnek yorum |
|---|---|---|
| Dakika | 0–59 | 30: saatin 30. dakikası |
| Saat | 0–23 | 0: gece yarısı saati |
| Ayın günü | 1–31 | 15: ayın 15. günü |
| Ay | 1–12 veya JAN–DEC | 6 veya JUN: haziran |
| Haftanın günü | 0–7 veya SUN–SAT | 1 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ısaltma | Gün |
|---|---|---|
| 0 veya 7 | SUN | Pazar |
| 1 | MON | Pazartesi |
| 2 | TUE | Salı |
| 3 | WED | Çarşamba |
| 4 | THU | Perşembe |
| 5 | FRI | Cuma |
| 6 | SAT | Cumartesi |
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.
*/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 dakika | Kısa durum kontrolü |
*/5 * * * * | Her 5 dakika | Önbellek yenileme |
*/15 * * * * | Her 15 dakika | Stok eşitleme |
*/30 * * * * | 00 ve 30. dakikalarda | Ara rapor |
0 * * * * | Her saat başı | Saatlik özet |
0 */2 * * * | 00:00'dan başlayarak çift saatlerde | Veri aktarımı |
0 */6 * * * | 00:00, 06:00, 12:00, 18:00 | Sitemap üretme |
0 0 * * * | Her gün 00:00 | Günlük kayıt |
0 3 * * * | Her gün 03:00 | Yedekleme |
0 9 * * 1-5 | Hafta içi 09:00 | İş günü raporu |
0 9,18 * * * | Her gün 09:00 ve 18:00 | Günde iki kontrol |
0 0 * * 0 | Pazar 00:00 | Haftalık arşiv |
0 0 1 * * | Ayın 1'i 00:00 | Aylık özet |
0 0 1 1 * | 1 Ocak 00:00 | Yı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
- İ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.
- 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.
- 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.
- Kaydedin ve gözleyin.
crontab -eiçinde mevcut görevleri koruyarak satırı ekleyin; sonuna yeni satır koyun.crontab -lkayı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.
- İş URL'sini ve POST metodunu girin; özel header olarak
X-Cron-Tokenile aynı gizli değeri ekleyin. - Cron ifadesi alanına hafta içi rapor için
30 9 * * 1-5yazın; Linux komutunu bu alana eklemeyin. Hazır aralık seçeneği de kullanılabilir. - İş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 →