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/crontab
Sistem 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 -e
crontab -l
crontab -r
(Dikkatli kullanın!)cron
İşlemlerisudo crontab -u kullanıcı_adı -e
sudo crontab -u kullanıcı_adı -l
Not: 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 --option
cron
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)