Açık Kaynak İşletim Sistemleri

11 - Zamanlanmış Görevler

Emre Can Yılmaz

Ondokuz Mayıs Üniversitesi

2025

cron: Zamanlanmış Görevler

  • cron, 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ı

  • Zamanlanmış görevlerin ayarlandığı dosyaya 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:

# .---------------- dakika (0 - 59)
# |  .------------- saat (0 - 23)
# |  |  .---------- ayın günü (1 - 31)
# |  |  |  .------- ay (1 - 12) veya jan,feb,mar,apr ...
# |  |  |  |  .---- haftanın günü (0 - 6) (Pazar=0 veya 7) veya sun,mon,...
# |  |  |  |  |
# *  *  *  *  * çalıştırılacak_komut

Zaman Alanlarındaki Özel Karakterler

  • * (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).

Sistem Geneli crontab: /etc/crontab

Sistem geneli zamanlanmış görev ayar dosyası /etc/crontab altında bulunur.

crontab Dosyasındaki Özellikler

  • SHELL 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.

    # m h dom mon dow user  command
    17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly

Kullanıcıya Özel cron İşlemleri

Her 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.

  • Kullanıcının kendi cron görevlerini düzenlemek için: crontab -e
  • Kullanıcının kendi cron görevlerini listelemek için: crontab -l
  • Kullanıcının kendi cron görevlerini (tümünü) silmek için: crontab -r (Dikkatli kullanın!)

Başka Bir Kullanıcıya Ait cron İşlemleri

  • Başka bir kullanıcıya ait cron görevlerini (root yetkisiyle) düzenlemek için: sudo crontab -u kullanıcı_adı -e
  • Başka bir kullanıcıya ait cron görevlerini (root yetkisiyle) listelemek için: 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şkenleri

  • Ortam Değişkenleri: cron 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:
    • Komutları tam yollarıyla belirtin (örn: /usr/bin/ls yerine ls).
    • Veya betiklerinizin (script) başında gerekli PATH ayarını yapın (export PATH="/usr/local/bin:/usr/bin:/bin:$PATH" gibi).
    • Kullanıcı crontab’ları için ~/.profile veya ~/.bashrc gibi dosyalar okunmaz.

cron Görevlerinde Çıktı Yönetimi

  • Çıktı Yönetimi:
    • Varsayılan olarak, bir cron görevinin ürettiği herhangi bir çıktı (STDOUT veya STDERR) görevin sahibi olan kullanıcıya e-posta ile gönderilir. (Sistemde bir Mail Transfer Agent - MTA kurulu ve ayarlıysa).
    • Bu istenmiyorsa veya çıktıyı bir dosyaya kaydetmek istiyorsanız yönlendirme kullanın:
      • * * * * * /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)
    • Sadece hataları e-posta ile almak için: * * * * * /path/to/komut > /dev/null (STDOUT’u gizle, STDERR e-postalanır)

Örnek 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)

Daha Kapsamlı Örnekler

  1. Her dakika çalıştıran cron girdisi: * * * * * /usr/local/bin/yedekle

  2. Günde 11:00’da ve 16:00’da olmak üzere 2 kez çalıştıran cron: 00 11,16 * * * /usr/local/bin/yedekle

  3. Her gün 09:00 - 18:00 arasında her saat başında çalıştıran cron: 00 09-18 * * * /usr/local/bin/yedekle

  4. 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

  5. Her 10 dakikada bir çalıştıran cron: */10 * * * * /usr/local/bin/yedekle

  6. İki ayda bir, ayın ilk günü saat 02:00’de çalıştıran cron: 0 2 1 */2 * /usr/local/bin/yedekle

Anahtar Kelimelerle cron Tanımlama

Sı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

Pratik Örnek: Belirli Bir Dosyaya Yazı Ekleme

/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:

  1. 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):

    # Eğer root olarak yapıyorsanız:
    sudo crontab -u cezmi -e
    # Eğer cezmi olarak giriş yaptıysanız:
    # crontab -e
  2. Açılan editöre eklenecek cron ifadesi:

    */2 * * * * echo "Merhaba Dünya! $(date)" >> /tmp/cron-cezmi

    (Tarih eklemek, her çalıştığını doğrulamak için faydalıdır.)

Diğer 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.

Periyodik Görev Dizinleri ve 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:

  • /etc/cron.hourly/: Bu dizindeki betikler her saat (genellikle xx:17’de) çalıştırılır.
  • /etc/cron.daily/: Bu dizindeki betikler her gün (genellikle 06:25’te) çalıştırılır.
  • /etc/cron.weekly/: Bu dizindeki betikler her hafta (genellikle Pazar 06:47’de) çalıştırılır.
  • /etc/cron.monthly/: Bu dizindeki betikler her ay (genellikle ayın 1’i 06:52’de) çalıştırılı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.

Diğer 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.
  • Bu nedenle, /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.
  • Dosya isimleri genellikle ilgili paket veya servisin adını taşır (örn: 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.

Sorun Giderme İpuçları

Bir cron görevi beklendiği gibi çalışmıyorsa:

  1. 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

  2. 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)
    • Bazı sistemlerde /var/log/cron dosyası olabilir.

Sorun Giderme İpuçları

  1. 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.

  2. İzinler:

    • Betiğin çalıştırılma izni (chmod +x /path/to/script.sh) olduğundan emin olun.
    • Cron görevinin sahibi olan kullanıcının betiği ve etkilediği dosyaları/dizinleri çalıştırma/okuma/yazma izinlerine sahip olduğundan emin olun.

Sorun Giderme İpuçları

  1. Manuel Test: Komutu veya betiği, cron’un çalıştıracağı kullanıcı olarak manuel olarak çalıştırarak test edin:

    sudo -u kullanıcı_adı /path/to/komut_veya_betik

    Eğer kullanıcı kendi crontab’ını kullanıyorsa, o kullanıcı olarak:

    /path/to/komut_veya_betik
  2. Çıktı Yakalama: Test için tüm çıktıları (STDOUT ve STDERR) geçici bir dosyaya yönlendirin:

    * * * * * /path/to/your/command >> /tmp/mycron_debug.log 2>&1

    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:

https://crontab.guru

Hazır örneklerle sık kullanılan cron ifadelerini de görebilirsiniz: https://crontab.guru/examples.html

Kaynaklar