Blog Yazısı · Yazılım

Cron Job Nedir? Saate Bağlı İş Rehberi

KepezWeb Ekibi 8 dk okuma Yazılım
Cron Job Nedir? Saate Bağlı İş Rehberi

Cron, isteğin ardından kalan iş için değil; saate bağlı ve kaçırılınca etkisi belli işler içindir. Bu rehber kuyruk ile cron’u ayırır, zaman ifadesini okutur, çakışma ve kaçırmayı pratik adımlarla ele alır. Küçük ekiplerin gece işlerini sessiz hataya düşmeden kurması için sade bir çerçeve sunar.

Cron job nedir sorusu çoğu ekipte “gece bir script çalıştırırız” diye kapanır. Asıl ayrım işin kuyruğa mı yoksa saate mi bağlı olduğudur. HTTP isteği bittikten sonra fatura e-postasını göndermek asenkron kuyruk işidir; her gece belirli saatte stok özeti üretmek cron işidir. Kaçırırsanız etkisi bellidir: rapor gelmez, dönem kapanmaz, yedek alınmaz. Bu rehber, zamanlanmış görevi kuyruk ve webhook ile karıştırmadan seçmeniz ve güvenli kurmanız içindir.

Cron job nedir ve saate neden bağlıdır

Cron, sunucuda takvime göre komut çalıştıran bir zamanlayıcıdır. Görev tanımı iki parçadır: ne zaman çalışacağı ve o anda hangi komutun gireceği. “Ne zaman” kısmı dakika, saat, ayın günü, ay ve haftanın günü alanlarıyla okunur. “Ne” kısmı ise rapor üretmek, süresi dolmuş kaydı temizlemek, yedek almak gibi sizin işinizdir.

Saate bağlılık burada süs değildir. İş, bir kullanıcının tıklamasından değil takvimden doğar. Gün sonu, hafta başı, ayın birinci günü, mesai dışı pencere gibi noktalar vardır. Bu nokta geçtiğinde iş ya yapılmıştır ya da o tur için kaçmıştır. Cron’un değeri tam da bu sözleşmedir: “şu saatte bu iş biter.”

Bu yüzden cron’u “arka planda çalışan her şey” diye genişletmek yanlıştır. Arka plan geniş bir çuvaldır. E-posta kuyruğu, dosya dönüştürme, ödeme sonrası muhasebe kaydı da arka plandadır; fakat onları tetikleyen şey saat değil, bir olayın kuyruğa düşmesidir. Saat yalnızca düzenli ve kaçırma maliyeti bilinen işte karar vericidir.

Kuyruk isteğe bağlı değildir, saate de bağlı değildir

Asenkron kuyruk, isteğin yanıtını bekletmeden kalan işi taşır. Kullanıcı “siparişi tamamla” der; sayfa hemen döner; e-posta, stok düşümü veya fatura PDF’i kuyruk işçisinde yürür. İş, saatten bağımsızdır. Gece yarısı da gelebilir, öğlen de. Gecikme birikir; kaçırma ise kuyruk boşalmadığı sürece “hiç çalışmadı” anlamına gelmez, “henüz işlenmedi” anlamına gelir.

Kuyruk, isteğin kendisinden bağımsız iş içindir. Cron, saate bağlı ve kaçırılınca etkisi belli iş içindir.

Karışıklık pratikte şöyle doğar: ekip, kuyruk kurmak yerine veritabanını her dakika tarayan bir cron yazar. “Ödenmiş ama mail gitmemiş sipariş var mı?” sorusu dakikalık taramayla sorulur. Bu düzenek bir süre çalışır. Sipariş artınca tarama uzar, kilitler çakışır, aynı mail iki kez gider. Asıl ihtiyaç bir olay kuyruğuydu; cron yalnızca eksik altyapının proteziydi.

Tersi hata da sık görülür. Gün sonu bakiyesi, kargo kesim saati, yasal dönem kapanışı gibi işler kuyruğa “fırsat olunca” bırakılır. Trafik sakinse iş gece biter. Yoğunsa sabaha sarkar. Raporu bekleyen kişi ise saati bekler, kuyruk uzunluğunu değil. KepezWeb projelerinde bu ayrımı baştan netleştirmek, gece sürprizini azaltır.

Üçüncü yol da vardır: dış sistem sizi çağırır. Ödeme veya kargo bildirimi bunun tipik halidir. O akışta doğru araç kuyruk veya cron değil, imzası doğrulanan bir webhook dur. Cron ile “beş dakikada bir ödeme durumunu sor” demek, hem geciktirir hem de karşı tarafın limitine çarpar.

Ne zaman cron, ne zaman kuyruk veya webhook

Kararı iş cümlesinden kurun. Cümlede saat, gün, ay veya “her gece” geçiyorsa cron adayıdır. Cümlede “şu olay olunca” geçiyorsa kuyruk veya webhook adayıdır. İkisi birden geçiyorsa işi bölün: olayı kuyrukta işleyin, özeti saatte toplayın.

Soru Cron Asenkron kuyruk Webhook
Ne tetikler? Takvim ve saat Uygulamanın kuyruğa bıraktığı mesaj Dış sistemin HTTP bildirimi
Kaçırma ne demektir? O turun işi yapılmaz; etki genellikle bir sonraki turdadır İş birikir, gecikir; kuyruk durmadıkça kaybolmaz Olay kaçarsa karşı taraf tekrar dener veya siz telafi edersiniz
Gecikme nasıl hissedilir? Rapor, dönem veya pencere kaçar Kullanıcı işlemi geç tamamlanır Dış kayıt sizin kaydınızla geç hizalanır
Tipik örnek Gece stok özeti, süresi dolmuş oturum temizliği Sipariş e-postası, görsel dönüştürme Ödeme onayı, kargo durum güncellemesi

E-ticarette örnekler netleşir. Müşteri ödemeyi bitirdiğinde mail kuyruğa aittir. Sanal pos sizi aradığında webhook aittir. “Her gün 02:00’de günün satış özetini üret, iade penceresi kapanan siparişleri işaretle” cümlesi cron aittir. Aynı işi tek bir “arka plan işçisi”nde eritmek, arızada hangi sözleşmenin bozulduğunu gizler.

Cron ifadesini okumak

Klasik ifadede beş alan vardır: dakika, saat, ayın günü, ay, haftanın günü. Yıldız “her değer”, sayı “şu değer”, virgül “şu liste”, tire “şu aralık”, eğik çizgi “şu adım” anlamına gelir. Okumayı ezberden değil cümleden yapın.

  • Her gün 02:00: dakika 0, saat 2, diğerleri yıldız.
  • Hafta içi 08:30: dakika 30, saat 8, haftanın günü 1-5.
  • Her saat başı: dakika 0, saat yıldız.
  • Ayın 1’i 04:15: dakika 15, saat 4, ayın günü 1.

İki tuzak işi bozar. Birincisi zaman dilimi. Sunucu saati UTC ise sizin 02:00’niz başka bir 02:00’dir. Türkiye için Avrupa/Istanbul dilimini görevde açık yazın; “sunucu saati neyse odur” demeyin. İkincisi “her dakika” alışkanlığıdır. Dakikalık tarama, kuyruk yerine geçen protezdir. Gerçekten her dakika gereken iş nadirdir; çoğu kez olay kaçmasın diye konmuştur ve asıl çözüm olayı kaçırmamaktır.

Ayın günü ile haftanın gününü birlikte doldurmak da şaşırtır. Bazı zamanlayıcılar bu iki alanı “veya” gibi okur. “Ayın 1’i ve pazartesi” demek isterken beklenmedik günlerde de çalışabilirsiniz. Dönemsel işte tek takvim kuralı seçin: ya ayın günü ya haftanın günü.

Kaçırılan ve çakışan görev

Klasik cron, kapalı kaldığınız saati genelde geriye dönüp doldurmaz. Sunucu 02:00’de kapalıysa o gecenin özeti oluşmayabilir. Sabah 09:00’da açılınca “kaçan turu şimdi çalıştır” demez. Bu, kuyruktan kopuşun tam da kalbidir: kuyruk birikir, cron bir turu kaybedebilir.

Kaçırmanın etkisini iş cümlesine yazın. “Rapor gelmedi, dünü elle kapatırız” kabul edilebilir bir etki olabilir. “Stok rezervi temizlenmedi, satış fazladan reddedildi” kabul edilemez. Kabul edilemeyen kaçışta ya görevi daha sık ve idempotent yazarsınız ya da sunucu açılınca telafi turu koşan ayrı bir düzenek kurarsınız. Telafi de saate bağlıdır: “açılışta bir kez, aynı gün işi iki kez üretme.”

Çakışma ayrı bir arızadır. İş 70 dakika sürer, cron her saat tetikler. İkinci kopya birinci bitmeden girer. Kilit yoksa çift mail, çift muhasebe satırı, yarım kalmış dosya görürsünüz. Kilit varsa ikinci kopya ya bekler ya da “zaten çalışıyor” deyip çıkar. Beklemek kuyruk oluşturur; çıkmak o saati kaçırır. Hangisini istediğinizi önceden seçin.

Idempotent iş, aynı girdide ikinci çalıştırmanın zararsız olmasıdır. “Dünün özetini üret” cümlesi, özet satırını her seferinde sıfırdan yazmalı, yanına bir satır daha eklememelidir. “Süresi dolmuş kaydı sil” cümlesi, kayıt yoksa sessizce bitmelidir. Cron’u güvenli kılan şey dakik ifade değil, ikinci kez basılınca bozulmayan iştir.

Güvenli cron kontrol listesi

Görevi yayın öncesi bir iş gibi ele alın. Komut, ortam değişkeni, kullanıcı ve çalışma dizini belirsizse gece “benim makinemde çalışıyordu” olur. PHP ve MySQL üzerine kurulu özel yazılımda bu belirsizlik sık görülür: web kullanıcısı ile cron kullanıcısı farklıdır, dosya yazılamaz, .env okunmaz. KepezWeb tarafında özel PHP/MySQL yazılım işlerinde görevin hangi kullanıcıyla, hangi dizin ve ortam dosyasıyla gireceği baştan yazılır.

  1. İş cümlesini saate bağlayın; olay işini kuyruğa bırakın.
  2. Zaman dilimini açık yazın; sunucu saatine güvenmeyin.
  3. Çalışma süresi tetik aralığından uzun olabiliyorsa kilit koyun.
  4. İkinci çalıştırmayı zararsız kılın; aynı satırı çoğaltmayın.
  5. Başarı, atlama ve hatayı ayrı loglayın; sessiz çıkış bırakmayın.
  6. Komutu web isteğinin içinden değil, ayrı bir süreçten koşturun.
  7. Crontab değişimini elle sunucuya yazmayın; yayın hattına alın.

Yedinci madde küçük ekipte en çok atlananıdır. Bir kişi SSH ile satır ekler, sonraki yayın o satırı bilmez, yeni sunucuda gece işi yoktur. Cron tanımı da koddur. CI/CD pipeline içinde test ve yayın kapısından geçmesi, “kim hangi saati değiştirdi” sorusunu da yanıtlar.

Logda aradığınız şey roman değil, yeniden kurulabilir izdir. Görev adı, planlanan saat, fiili başlangıç, kilit nedeniyle atlandı mı, kaç kayıt işlendi, ne kadar sürdü, çıkış kodu nedir. Bu iz sabah “çalıştı mı?” tartışmasını bitirir. Hata maili veya uyarı, logun yerine geçmez; log olmadan uyarı da tekrarı anlatmaz.

Ağır işi cron tetikleyip asıl yükü kuyruğa bırakmak da meşrudur. 02:00’de “bugünün fatura paketini kuyruğa koy” derseniz saat sözleşmesi korunur, işçiler paketi dağıtır. Cron şişman işi kendi içinde bitirmek zorunda değildir; saati tutmak zorundadır.

Yeni bir yazılım geliştirme işinde bu ayrımı mimari bir moda olarak değil, operasyon cümlesi olarak kurun. Kim hangi saatte hangi çıktıyı bekliyor? O çıktı kaçarsa kim ne yapacak? Cevap yoksa cron satırı erken yazılmış demektir.

Sıkça Sorulan Sorular

Cron her dakika çalışmalı mı?

Hayır. Her dakika tarama çoğu kez kuyruk yerine konmuş bir protezdir. Gerçekten dakikalık gereken iş varsa bile tarama koşulunu daraltın, kilit koyun ve asıl olayı kuyruğa taşıyıp dakikalık taramayı kaldırmayı planlayın.

Görev bitmeden yeni tur başlarsa ne olur?

Kilit yoksa iki kopya aynı kaydı işler. Kilit varsa ikinci kopya bekler veya atlar. Atlamak o turu kaçırmak, beklemek ise gizli bir kuyruk oluşturmaktır. Çalışma süresi tetik aralığına yaklaşan işte bu tercihi açık yazın.

Webhook ile cron aynı işi görür mü?

Görmez. Webhook dış olayın anlık bildirimi, cron sizin takvim sözleşmenizdir. Ödemeyi beş dakikada bir sormak cron ile webhook taklidi yapmaktır; hem geç kalır hem karşı tarafı yorar.

Sunucu o saatte kapalıysa iş ne olur?

Klasik cron o turu genelde geri doldurmaz. Sabah açılınca dünün özeti kendiliğinden oluşmayabilir. Kaçışın kabul edilmediği işte açılış telafisi ve idempotent yazım şarttır.

Cron’u uygulama içinden mi, sistemden mi kurmalıyım?

Tetik sistem zamanlayıcısında, iş uygulama komutunda olsun. Komut aynı ortam dosyasını, aynı kullanıcıyı ve aynı sürümü kullansın. Tanımı sunucuya elle yazmak yerine yayınla birlikte gelsin; aksi halde yeni kopyada gece işi kaybolur.

Saate bağlı işleri uygulamanın geri kalanıyla aynı özenle kurmak istiyorsanız KepezWeb ile konuşabilirsiniz. İhtiyacı netleştirmek için teklif alın; zamanlanmış görevleri kuyruk, yayın hattı ve operasyon cümlesiyle birlikte planlayalım.

Bu yazıyı paylaş