- cron nasıl çalışır?
- Crontab satırı: beş alan ve komut
- crontab komutlarıyla iş eklemek ve düzenlemek
- Cron'un ortamı: PATH, çıktı ve günlük
- Kullanım izni: cron.allow ve cron.deny
- cron ile systemd zamanlayıcı arasında seçim
- Sık hatalar ve kontrol listesi
- Bu beceriyi Mindset programlarında nerede çalışırsınız?
- Sık sorulan sorular
Linux'ta cron ile zamanlanmış görev nasıl kurulur
crontab söz dizimi, iş ekleme, ortam ve PATH farkı, çıktı yönlendirme ve cron ile systemd zamanlayıcı seçimini örneklerle öğrenin.
cron nasıl çalışır?
cron, belirli zamanlarda komut veya betik çalıştıran bir zamanlayıcı servisidir. Arka planda çalışan cron servisi (crond) her dakika crontab dosyalarını kontrol eder ve zamanı gelen işleri tetikler. Her kullanıcının kendi crontab dosyası olabilir; sistem genelindeki işler ise /etc/crontab ile /etc/cron.d dizinindeki dosyalarda tutulur.
Önemli bir ayrım vardır: kullanıcı crontab'ı satırlarında beş zaman alanı ve komut bulunur; sistem crontab'ında ise komuttan önce işi hangi kullanıcının çalıştıracağını belirten ek bir alan yer alır. Aralarındaki bu fark, kopyala-yapıştır yapan birçok kişiyi yanıltır: kullanıcı crontab'ına yanlışlıkla kullanıcı alanı yazarsanız, o kullanıcı adı komutun ilk kelimesi sayılır ve iş çalışmaz.
Cron çıktısını kendiliğinden e-posta ile kullanıcıya yollamaya çalışır; sistemde posta yoksa çıktı kaybolur. Bu yüzden her işin çıktısını açıkça bir dosyaya ya da günlüğe yönlendirmek gerekir.
Crontab satırı: beş alan ve komut
Bir crontab satırı soldan sağa dakika, saat, ayın günü, ay ve haftanın günü alanlarından oluşur; ardından komut gelir. Her alana belirli bir değer, yıldız (her değer), virgülle liste, tire ile aralık ya da bölme işareti ile adım değeri yazılabilir.
Örnek satırlar: • 30 2 * * * /usr/local/bin/yedek.sh : her gün gece yarısından sonra belirli bir dakikada yedek betiğini çalıştırır. • */15 * * * * /usr/local/bin/kontrol.sh : her çeyrek saatte bir kontrol betiğini çalıştırır. • 0 9 * * 1-5 /usr/local/bin/rapor.sh : hafta içi her sabah belirli saatte rapor betiğini çalıştırır.
Ayrıca @reboot gibi kısayollar vardır; açılışta bir kez çalıştırır. @daily, @weekly ve @hourly de sık kullanılan kısayollardır.
Alan sırasını unutmak kolaydır. Emin değilseniz satırı eklemeden önce zamanlamayı alan alan yazılı olarak çözümleyin: hangi dakika, hangi saat, hangi gün? Yanlış alan sırası, işin hiç çalışmaması ya da çok sık çalışmasıyla sonuçlanır.
crontab komutlarıyla iş eklemek ve düzenlemek
Kullanıcı crontab'ını düzenlemek için crontab -e kullanılır. Editör açılır, satırı ekleyip kaydedince cron yeni tanımı otomatik alır; ayrıca servisi yeniden başlatmanız gerekmez. Mevcut girdileri görmek için crontab -l, tümünü silmek için crontab -r kullanılır. -r, onay istemeden siler; -e yerine yanlışlıkla -r basmak sık görülen bir kazadır, bu yüzden önce crontab -l çıktısını dosyaya yedeklemek iyi bir alışkanlıktır.
Başka bir kullanıcının crontab'ını yönetmek için yönetici -u seçeneğini kullanır: crontab -u ayse -l gibi. Sistem genelinde ise /etc/cron.d dizinine ayrı bir dosya bırakmak, paketlerin veya otomasyon araçlarının iş eklemesi için temiz bir yoldur. Bu dosyalarda kullanıcı alanı yazılır.
Saatlik, günlük, haftalık ve aylık çalıştırma için /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly ve /etc/cron.monthly dizinleri vardır; çalıştırılabilir bir betiği buraya koymak yeterlidir. Bu dizinlerdeki işlerin tam saati sistemin yapılandırmasına bağlıdır, dolayısıyla belirli saat gereken işlerde crontab satırı tercih edilmelidir.
Cron'un ortamı: PATH, çıktı ve günlük
Cron işleri sizin etkileşimli kabuğunuzdan çok daha kısıtlı bir ortamda çalışır. PATH değişkeni kısadır, profil dosyaları okunmaz ve çalışma dizini genellikle ev dizinidir. Bu yüzden terminalde çalışan bir betik cron'da "komut bulunamadı" hatası verebilir. Çözüm: betikte komutları tam yolla çağırmak, gerekli değişkenleri betiğin başında tanımlamak ya da crontab'ın başına PATH satırı eklemektir.
Çıktıyı mutlaka yönlendirin: komut >> /var/log/yedek.log 2>&1 biçimi, hem standart çıktıyı hem hata çıktısını bir dosyaya ekler. Hataların kaybolmaması, sessiz çalışmayan bir işi fark etmenin tek yoludur. Cron'un kendi çalıştırma kaydı da sistem günlüğüne düşer; Red Hat tabanlı sistemlerde /var/log/cron dosyasında, journal kullanılan sistemlerde ise journalctl -u crond ile görülebilir.
Aynı işin üst üste çalışmasını önlemek için uzun süren işlerde kilit mekanizması kullanın. Örneğin flock komutu ile betiğin aynı anda yalnızca bir kopyası çalışır; bu, bir önceki çalıştırma bitmeden yeni çalıştırmanın başlayıp veriyi bozmasını engeller.
Kullanım izni: cron.allow ve cron.deny
Hangi kullanıcıların crontab kullanabileceği /etc/cron.allow ve /etc/cron.deny dosyalarıyla kontrol edilir. Kural şöyledir: cron.allow varsa yalnızca içindeki kullanıcılar kullanabilir; yoksa cron.deny içindeki kullanıcılar engellenir. İkisi de yoksa davranış dağıtıma göre değişir. Güvenlik odaklı sistemlerde allow listesi tercih edilir.
Bu izinler yalnızca kullanıcı crontab'ını (crontab komutu) kapsar; /etc/cron.d içindeki sistem dosyalarını etkilemez. Bir kullanıcının crontab'ı engellenmişse "bu kullanıcının crontab kullanması yasak" benzeri bir hata alır.
Tek seferlik zamanlama gerektiğinde at komutu uygundur: belirli bir anda bir kez çalıştırır. Düzenli tekrar gerektiğinde cron, belirli bir olay sonrası çalışması gerektiğinde ise systemd birimi daha doğru seçimdir.
cron ile systemd zamanlayıcı arasında seçim
Birçok modern sistemde systemd zamanlayıcıları (timer) cron'a alternatiftir. Basit, birkaç satırlık ve sistem bağımsız taşınabilir işlerde cron hızlıdır ve herkes bilir. Çıktının günlüğe otomatik düşmesi, çalıştırılacak servisin bağımlılıkları, kaynak sınırları ve kaçırılan çalışmanın sonradan telafisi gerekiyorsa systemd zamanlayıcısı daha elverişlidir.
Karar verirken sorulacaklar: iş hangi ortam değişkenlerini istiyor, sonucu nerede izleyeceksiniz, makine kapalıyken kaçan çalışma önemli mi, işi başka servislere bağlı tutmak gerekiyor mu? Hepsi hayır ise cron yeterlidir.
Örnek hata akışı: yedek betiği terminalde çalışıyor ama cron'da sessiz kalıyor. Kontrol sırası: crontab -l ile satırı doğrulayın, cron günlüğünde işin tetiklendiğini görün, betiğin çıktısını bir dosyaya yönlendirin, PATH sorununu ve betik izinlerini (çalıştırılabilir mi) kontrol edin. Çoğu zaman sorun komutun bulunamaması ya da dosyanın çalıştırılabilir olmamasıdır.
Sık hatalar ve kontrol listesi
Sık hatalar: yanlış alan sırası, kullanıcı crontab'ına kullanıcı alanı yazmak, PATH farkını hesaba katmamak, çıktıyı yönlendirmemek, crontab -r ile yanlışlıkla tüm işleri silmek, betiğe çalıştırma izni vermemek, yüzde işaretinin crontab'ta özel anlam taşıdığını unutmak. Özellikle komut içinde date +%Y gibi kullanımlarda yüzde işareti ters eğik çizgiyle kaçırılmalıdır.
Kontrol listesi: • Satır crontab -l çıktısında görünüyor mu? • Cron servisi çalışıyor mu (systemctl status crond)? • Betik çalıştırılabilir ve tam yollarla mı yazılı? • Çıktı ve hatalar bir dosyaya yönlendirildi mi? • Zamanlama beklendiği gibi mi (zamanı kısa süreliğine yakın bir değere ayarlayıp deneyin)? • Aynı işin üst üste çalışma riski var mı?
Bu beceriyi Mindset programlarında nerede çalışırsınız?
RHCSA Sertifikasyon Hazırlık programının Süreç, Servis ve Zamanlama modülü cron ve diğer zamanlama araçlarını sistem yöneticisi senaryolarıyla çalıştırır. Bash ile Sistem Otomasyonu ve Betik Yazımı programında ise Test, Zamanlama ve Proje modülü, yazdığınız betikleri düzenli çalıştırma ve güvenli betik ilkeleriyle birleştirir. Düzenli yedek, rapor ve bakım işlerini otomatikleştirmek isteyen sistem ve operasyon ekipleri için ikisi birbirini tamamlar.
İlgili Mindset programı
RHCSA Sertifikasyon Hazırlık
Sık sorulan sorular
Cron işi neden terminalde çalışırken cron'da çalışmıyor?
Cron daha kısıtlı bir ortamda çalışır: PATH kısadır, profil dosyaları yüklenmez. Komutu tam yolla yazın, gerekli değişkenleri betikte tanımlayın ve çıktıyı bir dosyaya yönlendirin. Betiğin çalıştırma izni olup olmadığını da kontrol edin. Hata çıktısı bu noktalardan hangisinin sorun olduğunu gösterir.
Crontab'ta yüzde işareti neden sorun çıkarır?
Crontab satırında yüzde işareti yeni satır anlamı taşır; komut içinde date +%Y gibi kullanımlar kesilir. Çözüm yüzde işaretinin önüne ters eğik çizgi koymak ya da tarih üreten komutu bir betiğe taşıyıp crontab'tan betiği çağırmaktır.
Cron makine kapalıyken kaçan işi sonradan çalıştırır mı?
Klasik cron çalıştırmaz; zamanı geçen iş atlanır. Kaçırılan işlerin telafisi gerekiyorsa anacron ya da systemd zamanlayıcısının kalıcılık özelliği kullanılabilir. Saatlik, günlük gibi dizinlerdeki işler çoğu dağıtımda anacron mantığıyla yönetilir. Anacron işin son çalışma zamanını kaydeder ve makine açıldığında süresi geçmiş günlük, haftalık ya da aylık işleri kısa bir gecikmeyle çalıştırır. systemd zamanlayıcısında aynı davranış Persistent=true ayarıyla açılır.
Bir cron işi çalışıyor mu nasıl anlarım?
Cron günlüğünde işin tetiklendiğini görmek için Red Hat tabanlı sistemlerde /var/log/cron dosyasına ya da journalctl çıktısına bakın. İşin kendi çıktısı için komuta bir günlük dosyası yönlendirmesi ekleyin. Bu iki kayıt, işin tetiklenip tetiklenmediğini ve çalışırken hata verip vermediğini ayırır.
İlgili rehberler
İlgili eğitimler
Kategori: DevOps ve Bulut Teknolojileri