11 - Zamanlanmış Görevler
2025
cron: Zamanlanmış Görevlercron, UNIX ve Linux benzeri sistemlerde belirli komutları veya betikleri (script) düzenli aralıklarla otomatik olarak çalıştırmak için kullanılan bir zamanlayıcı arka plan programıdır (daemon).
Sistem başladığında otomatik olarak çalışır ve zamanı geldiğinde tanımlanmış görevleri yürütür.
crontab: Görev Tanımlama Dosyasıcrontab (cron table) denir. Her kullanıcının kendi crontab dosyası olabileceği gibi, sistem geneli tanımlar için de özel crontab dosyaları bulunur.crontab Dosyasının YapısıBir crontab satırı genellikle 5 zaman alanından ve çalıştırılacak komuttan oluşur:
* (yıldız): Herhangi bir değer (örn: her dakika, her saat)., (virgül): Değer listesi (örn: 1,15 -> 1. ve 15. dakikalarda).- (tire): Değer aralığı (örn: 8-17 -> 8’den 17’ye kadar olan saatlerde)./ (bölü işareti): Adım değeri (örn: */5 -> her 5 dakikada bir).crontab: /etc/crontabSistem geneli zamanlanmış görev ayar dosyası /etc/crontab altında bulunur.
crontab Dosyasındaki ÖzelliklerSHELL değişkeni komutlar çalıştırılırken kullanılacak kabuk programını belirler.
PATH değişkeni komutların aranacağı dizinleri belirtir.
ÖNEMLİ NOT: /etc/crontab dosyasına özel olarak, çalıştırılacak komuttan önce komutu hangi kullanıcının çalıştıracağı da belirtilir.
cron İşlemleriHer kullanıcının kendine ait bir crontab dosyası olabilir. Bu dosya genellikle /var/spool/cron/crontabs/kullanıcı_adı altında saklanır ancak doğrudan düzenlenmez.
crontab -ecrontab -lcrontab -r (Dikkatli kullanın!)cron İşlemlerisudo crontab -u kullanıcı_adı -esudo crontab -u kullanıcı_adı -lNot: Kullanıcı crontab’larında komutlar, o kullanıcının yetkileriyle çalışır ve komutun önüne kullanıcı adı yazılmaz.
cron Görevlerinde Ortam Değişkenlericron tarafından çalıştırılan komutlar, genellikle interaktif bir kabukta sahip olduğunuzdan çok daha kısıtlı bir ortam değişkeni setiyle çalışır. Özellikle PATH değişkeni minimal olabilir. Bu nedenle:
/usr/bin/ls yerine ls).PATH ayarını yapın (export PATH="/usr/local/bin:/usr/bin:/bin:$PATH" gibi).~/.profile veya ~/.bashrc gibi dosyalar okunmaz.cron Görevlerinde Çıktı Yönetimi* * * * * /path/to/komut > /dev/null 2>&1 (Tüm çıktıları gizle)* * * * * /path/to/komut >> /var/log/komut.log 2>&1 (Tüm çıktıları bir dosyaya ekle)* * * * * /path/to/komut > /dev/null (STDOUT’u gizle, STDERR e-postalanır)cron Görevi Zamanları/usr/local/bin/yedekle isimli bir betiği farklı zamanlarda çalıştırma örnekleri:
7 * * * * /usr/local/bin/yedekle Saat her 7. dakikayı gösterdiğinde çalıştır. (Örn: 13:07, 00:07)
0 7 * * * /usr/local/bin/yedekle Her gün saat 07:00’da çalıştır.
0 0 7 * * /usr/local/bin/yedekle Her ayın 7. gününde saat 00:00’da çalıştır.
0 0 * * 7 /usr/local/bin/yedekle Her Pazar saat 00:00’da çalıştır. (0 da Pazar’dır)
Her dakika çalıştıran cron girdisi: * * * * * /usr/local/bin/yedekle
Günde 11:00’da ve 16:00’da olmak üzere 2 kez çalıştıran cron: 00 11,16 * * * /usr/local/bin/yedekle
Her gün 09:00 - 18:00 arasında her saat başında çalıştıran cron: 00 09-18 * * * /usr/local/bin/yedekle
Sadece hafta içi (Pazartesi-Cuma) 09:00 - 18:00 arasında her saat başında çalıştırılan cron: 00 09-18 * * 1-5 /usr/local/bin/yedekle
Her 10 dakikada bir çalıştıran cron: */10 * * * * /usr/local/bin/yedekle
İki ayda bir, ayın ilk günü saat 02:00’de çalıştıran cron: 0 2 1 */2 * /usr/local/bin/yedekle
cron TanımlamaSık kullanılan zamanlamalar için özel anahtar kelimeler de kullanılabilir:
Anahtar kelime Eşdeğer Açıklama
@reboot - Sistem yeniden başlatıldıktan sonra bir kez çalışır.
@yearly 0 0 1 1 * Yılda bir (1 Ocak gece yarısı). (veya @annually)
@monthly 0 0 1 * * Ayda bir (ayın ilk günü gece yarısı).
@weekly 0 0 * * 0 Haftada bir (Pazar gece yarısı).
@daily 0 0 * * * Günde bir (gece yarısı). (veya @midnight)
@hourly 0 * * * * Saatte bir (saat başında).Örnek: @daily /scripts/gunluk_bakim.sh
/tmp/cron-cezmi dosyasına her iki dakikada bir “Merhaba Dünya!” satırı eklenmek isteniyor. Bu işlemi, cezmi isimli kullanıcının crontab dosyasını kullanarak yapmak için:
cezmi kullanıcısının crontab’ını düzenlemek için (cezmi olarak giriş yapılmışsa crontab -e, root ise sudo crontab -u cezmi -e):
Açılan editöre eklenecek cron ifadesi:
(Tarih eklemek, her çalıştığını doğrulamak için faydalıdır.)
cron Yönetim Yöntemleri: Sistem Dizinleri (Bölüm 1)cron görevlerini yönetmenin bir yolu da sistemdeki belirli dizinlere çalıştırılabilir betikler (script) yerleştirmektir.
run-parts Komutu Nedir?
run-parts, belirtilen bir dizindeki tüm çalıştırılabilir dosyaları (betikleri veya programları) çalıştıran bir yardımcı programdır. Genellikle alfabetik sırayla çalıştırır. Dosya isimlerinde nokta (.) veya diğer özel karakterler olmamalıdır.
run-parts Kullanımı/etc/crontab dosyası içerisinde genellikle aşağıdaki gibi satırlar bulunur:
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )Bu satırlar, run-parts komutunu kullanarak ilgili dizinlerdeki betikleri çalıştırır:
Bu dizinlere koyacağınız betiklerin sadece çalıştırılabilir (chmod +x) olması ve isimlerinin run-parts kurallarına uyması (nokta vs. içermemesi) yeterlidir. Zamanlama /etc/crontab içindeki run-parts satırlarıyla zaten sağlanmıştır.
cron Yönetim Yöntemleri: Sistem Dizinleri (Bölüm 2)/etc/cron.d/ Dizini:
Bu dizin, sistem uygulamalarının veya yöneticilerin kendi özel cron görevlerini eklemesi için daha esnek bir yol sunar.
Bu dizine konulan dosyalar, doğrudan /etc/crontab dosya formatında olmalıdır. Yani, zamanlama alanlarından sonra komutu çalıştıracak kullanıcı adı da belirtilmelidir.
# Örnek /etc/cron.d/my-custom-job dosyası içeriği:
# Her 5 dakikada bir someuser adına mycommand çalıştır
*/5 * * * * someuser /usr/local/bin/mycommand --optioncron daemonu (arka plan programı), /etc/cron.d/ dizinini düzenli olarak kontrol eder ve buradaki dosyaları okuyarak içlerindeki görevleri zamanlar./etc/cron.d/ içindeki dosyalar için run-parts komutuna ihtiyaç duyulmaz. cron daemonu bu dosyaların içeriğini doğrudan crontab tanımı olarak yorumlar.apt, php, 0hourly) ve run-parts’ın isim kısıtlamalarına (nokta içermeme gibi) tabi değildir. Ancak yine de standart karakterler kullanmak iyi bir pratiktir.Bir cron görevi beklendiği gibi çalışmıyorsa:
Cron Daemon Durumu: cron servisinin çalışıp çalışmadığını kontrol edin: systemctl status cron (veya crond, cronie dağıtıma göre) Eğer çalışmıyorsa: systemctl start cron && systemctl enable cron
Sistem Logları: cron aktiviteleri genellikle sistem loglarına kaydedilir. Hataları veya çalışma bilgilerini burada arayın:
grep CRON /var/log/syslog (Debian/Ubuntu tabanlı sistemlerde)journalctl -u cron veya journalctl -u crond (systemd kullanan sistemlerde)/var/log/cron dosyası olabilir.Komut Yolları ve Ortam: Komutların veya betiklerin tam yolunu kullandığınızdan emin olun (örn: /usr/bin/python3). cron’un PATH’i kısıtlıdır.
İzinler:
chmod +x /path/to/script.sh) olduğundan emin olun.Manuel Test: Komutu veya betiği, cron’un çalıştıracağı kullanıcı olarak manuel olarak çalıştırarak test edin:
Eğer kullanıcı kendi crontab’ını kullanıyorsa, o kullanıcı olarak:
Çıktı Yakalama: Test için tüm çıktıları (STDOUT ve STDERR) geçici bir dosyaya yönlendirin:
Bu dosya, komutun ne yaptığını veya nerede hata verdiğini anlamanıza yardımcı olabilir.
crontab.guru: Zamanlama Yardımcısıcron zamanlama ifadelerini yazmak veya doğrulamak için hızlı ve basit bir çevrimiçi düzenleyici:
Hazır örneklerle sık kullanılan cron ifadelerini de görebilirsiniz: https://crontab.guru/examples.html
man 5 crontab (crontab dosya formatı için)man crontab (crontab komutu için)