Bir Linux cron job, belirlediğiniz takvime göre arka planda komut veya script çalıştıran zamanlanmış bir görevdir. Yedek almak, log temizlemek, bir API'yi yoklamak ya da Laravel'in zamanlayıcısını tetiklemek gibi tekrar eden işleri elinizle değil, sistemin tetiklemesini istediğinizde cron tam da aradığınız araçtır. Bu yazıda crontab sözdizimini, gerçek örnekleri, loglamayı ve insanların en çok takıldığı tuzakları net biçimde anlatıyorum.
cron, crontab ve cron daemon
Üç kavramı ayırmak işleri kolaylaştırır:
- cron: arka planda sürekli çalışan, zamanı kontrol edip görevleri tetikleyen servis (daemon, çoğu dağıtımda
cronveyacrond). - crontab: "cron table" yani görevlerin listelendiği yapılandırma dosyası. Her kullanıcının kendi crontab'ı vardır.
- cron job: o tablodaki tek bir satır — bir zamanlama + çalıştırılacak komut.
Kendi crontab'ınızı düzenlemek için:
crontab -e # düzenle
crontab -l # mevcut görevleri listele
crontab -r # tüm görevleri sil (dikkat!)
Crontab sözdizimi: beş alan
Her satır beş zaman alanı ve ardından komuttan oluşur:
# ┌───────── dakika (0-59)
# │ ┌─────── saat (0-23)
# │ │ ┌───── ayın günü (1-31)
# │ │ │ ┌─── ay (1-12)
# │ │ │ │ ┌─ haftanın günü (0-7, 0 ve 7 = Pazar)
# │ │ │ │ │
# * * * * * calistirilacak-komut
Özel karakterler her alanda kullanılabilir:
*— her değer ("her dakika", "her saat").,— liste:0,15,30,45.-— aralık:1-5(Pazartesi–Cuma)./— adım:*/10(her 10 birimde bir).
İşe yarar cron örnekleri
Sözdizimi soyut görünebilir, somut örneklerle netleşir:
# Her gün gece 02:30'da yedek script'i
30 2 * * * /home/aslain/scripts/backup.sh
# Her 5 dakikada bir sağlık kontrolü
*/5 * * * * /usr/bin/curl -fsS https://aslain.dev/health
# Hafta içi her gün saat 09:00'da rapor
0 9 * * 1-5 /home/aslain/scripts/report.sh
# Her ayın 1'inde gece yarısı log arşivleme
0 0 1 * * /home/aslain/scripts/rotate-logs.sh
# Her 15 dakikada bir Laravel scheduler
*/15 * * * * cd /var/www/site && php artisan schedule:run
Sözdizimini ezberlemek zorunda değilsiniz: crontab.guru gibi araçlar yazdığınız ifadeyi insan diline çevirir. Yine de mantığı anlamak, hata ayıklarken zaman kazandırır.
Ortam değişkenleri ve mutlak yollar
cron'un en sinsi yanı şu: job'lar çok sade bir ortamda çalışır. Terminalinizdeki PATH, alias'lar ve profil ayarları cron'da yoktur. Bu yüzden "elimde çalışıyordu ama cron'da çalışmadı" şikâyeti çok yaygındır.
- Komutları ve dosyaları mutlak yolla yazın:
phpyerine/usr/bin/php,./script.shyerine tam yol. - Script içinde gerekiyorsa
cdile doğru dizine geçin ya da yolları sabitleyin. - Gereken değişkenleri crontab'ın başında tanımlayın:
PATH=/usr/local/bin:/usr/bin:/bin
SHELL=/bin/bash
MAILTO=hello@aslain.dev
30 2 * * * /home/aslain/scripts/backup.sh
Hangi yolda olduğunuzu öğrenmek için terminalde which php veya command -v node çalıştırıp çıkan tam yolu kullanın.
Çıktıyı loglama ve hata yakalama
Varsayılan olarak cron, bir job'un ürettiği çıktıyı kullanıcıya e-posta göndermeye çalışır. Mail yapılandırması yoksa çıktı kaybolur ve neyin yanlış gittiğini göremezsiniz. Çözüm: çıktıyı bir dosyaya yönlendirin.
# stdout ve stderr'ı log dosyasına yaz
30 2 * * * /home/aslain/scripts/backup.sh >> /var/log/backup.log 2>&1
Buradaki 2>&1, hata akışını (stderr) standart çıktıyla (stdout) aynı dosyaya yollar. >> ise üzerine yazmak yerine ekler. Sessiz olmasını istediğiniz, çıktısı umurunuzda olmayan bir job için > /dev/null 2>&1 kullanabilirsiniz — ama bunu hata ayıklamayı bitirdikten sonra yapın.
Job'ların gerçekten tetiklenip tetiklenmediğini sistem loglarından da görebilirsiniz:
grep CRON /var/log/syslog # Debian/Ubuntu
journalctl -u cron --since today # systemd tabanlı sistemler
Sık yapılan hatalar
- Yüzde işareti. crontab'ta
%özel anlam taşır (yeni satır) ve komutu böler. Tarih biçimlerinde geçen%karakterlerini\%ile kaçırın. - Çakışan çalışmalar. Bir job, bir öncekinden uzun sürerse üst üste binebilir.
flockile kilitleyin:flock -n /tmp/job.lock /home/aslain/scripts/job.sh. - Çalıştırma izni. Script'in çalıştırılabilir olduğundan emin olun:
chmod +x script.shve dosyanın başında shebang (#!/bin/bash) bulunsun. - Yanlış kullanıcı. Görev hangi kullanıcının yetkilerine ihtiyaç duyuyorsa o kullanıcının crontab'ına yazın;
rootgörevleri içinsudo crontab -e.
Sık Sorulan Sorular
cron yerine systemd timer ne zaman kullanmalıyım?
Modern systemd dağıtımlarında timer'lar; bağımlılık, gecikmeli başlatma, kaçırılan çalışmaları telafi (Persistent=true) ve detaylı loglama gibi konularda daha güçlüdür. Basit periyodik görevler için cron fazlasıyla yeter ve her yerde bulunur; karmaşık servis benzeri zamanlamalarda systemd timer'ı düşünün.
Saniyede bir çalıştırma yapabilir miyim?
Hayır, cron'un en küçük birimi bir dakikadır. Daha sık çalıştırma için bir script içinde döngü ve sleep kullanabilir ya da systemd timer'ın OnUnitActiveSec ayarına geçebilirsiniz.
Sunucu kapalıyken kaçan job'lar ne olur?
Klasik cron kaçan çalışmaları telafi etmez; makine açık değilken o zaman dilimi atlanır. Önyüklemede gecikmeli görevleri çalıştırmak için anacron veya systemd timer'ın Persistent özelliğini kullanın.
Zamanlanmış görevleriniz mi karışık? Sunucunuzdaki yedekleri, dağıtımları ve bakım script'lerini güvenilir cron job'larına bağlamak istiyorsanız benimle iletişime geçin — birlikte düzenli ve loglanan bir kurulum çıkaralım.