Açık Kaynak İşletim Sistemleri

11 - Zamanlanmış Görevler

Emre Can Yılmaz

Ondokuz Mayıs Üniversitesi

2026

Zamanlanmış Görevler

Bazı işlemlerin belirli zamanlarda otomatik çalışması gerekebilir.

Örneğin:

  • Her gece yedek almak
  • Her saat log dosyalarını kontrol etmek
  • Her gün geçici dosyaları temizlemek
  • Belirli aralıklarla rapor üretmek
  • Sistem açıldığında bir betiği çalıştırmak

Linux sistemlerinde bu tür işler için yaygın olarak cron kullanılır.

Neden Elle Çalıştırmak Yetmez?

Bir komutu terminalden elle çalıştırabiliriz.

Ancak bazı durumlarda bu yeterli değildir:

  • İşlem her gün aynı saatte çalışmalıdır.
  • Kullanıcı o anda bilgisayar başında olmayabilir.
  • Sistem yeniden başladıktan sonra görevlerin devam etmesi gerekebilir.
  • Rutin işlemlerin unutulmaması gerekir.
  • Yönetim işleri belirli bir düzene bağlanmalıdır.

cron, bu işleri belirli bir zaman planına göre otomatikleştirir.

cron Ne İşe Yarar?

cron, belirli komutları veya betikleri tanımlanan zamanlarda otomatik çalıştıran arka plan servisidir.

  • Sistem açıldığında genellikle otomatik başlar.
  • Zamanı takip eder.
  • Tanımlı görevleri zamanı geldiğinde çalıştırır.
  • Kullanıcıya veya sisteme ait görevleri yürütebilir.

Kısaca:

cron çalıştırır, crontab görevleri tanımlar.

Cron Ekosistemi

Kavram / Konum Ne işe yarar?
cron Görevleri zamanı gelince çalıştıran servis
Kullanıcı crontab’ı Kullanıcının kendi zamanlanmış görevleri
/etc/crontab Sistem geneli cron tanımları
/etc/cron.d/ Paket veya servis bazlı özel cron tanımları
/etc/cron.hourly/ vb. Belirli periyotlarda çalışan betikler

Bu yapıların hepsi cron ile ilgilidir; ancak kullanım biçimleri aynı değildir.

Kullanıcı Crontab’ı

Her kullanıcının kendisine ait bir crontab dosyası olabilir.

Görevleri düzenlemek için:

crontab -e

Görevleri listelemek için:

crontab -l

Tüm görevleri silmek için:

crontab -r

crontab -r dikkatli kullanılmalıdır; kullanıcının tüm cron görevlerini siler.

Editör Seçimi

crontab -e ilk çalıştırıldığında sistem sizden bir editör seçmenizi isteyebilir.

Linux’a yeni başlayanlar için nano daha kolay olabilir.

Geçici olarak nano ile açmak için:

EDITOR=nano crontab -e

Kalıcı olarak tercih edilen editör değiştirilebilir; ancak bu derste geçici kullanım yeterlidir.

Daha Güvenli Crontab Kullanımı

Değişiklik yapmadan önce mevcut görevleri yedeklemek iyi bir alışkanlıktır.

crontab -l > crontab-yedek.txt

Bazı sistemlerde silme öncesi onay almak için:

crontab -i

crontab -i her sistemde desteklenmeyebilir. Desteklenmiyorsa en güvenli yol önce yedek almaktır.

Başka Bir Kullanıcının Crontab’ı

Root yetkisiyle başka bir kullanıcının cron görevleri düzenlenebilir.

Listeleme:

sudo crontab -u kullanici_adi -l

Düzenleme:

sudo crontab -u kullanici_adi -e

Kullanıcı crontab’larında satıra ayrıca kullanıcı adı yazılmaz.

Komutlar ilgili kullanıcının yetkileriyle çalışır.

Crontab Satırının Yapısı

Bir kullanıcı crontab’ında satır yapısı şöyledir:

dakika saat ayın_günü ay haftanın_günü komut

Örnek:

0 7 * * * /home/ogrenci/bin/yedekle.sh

Bu görev, /home/ogrenci/bin/yedekle.sh betiğini her gün saat 07:00’da çalıştırır.

Beş Zaman Alanı

Alan Aralık Anlamı
Dakika 0-59 Saatin kaçıncı dakikası
Saat 0-23 Günün hangi saati
Ayın günü 1-31 Ayın kaçıncı günü
Ay 1-12 Hangi ay
Haftanın günü 0-7 Haftanın hangi günü

Haftanın günü alanında 0 ve bazı sistemlerde 7, Pazar gününü ifade eder.

Gün ve Ay Adları

Bazı cron sürümlerinde sayı yerine kısa adlar da kullanılabilir.

Örnek gün adları:

SUN, MON, TUE, WED, THU, FRI, SAT

Örnek ay adları:

JAN, FEB, MAR, APR, MAY, JUN

Örnek:

0 9 * * MON /home/ogrenci/bin/rapor.sh

Bu ifade, betiği her Pazartesi 09:00’da çalıştırır.

Özel Karakterler

Karakter Anlamı Örnek
* Her değer * * * * *
, Değer listesi 0 9,17 * * *
- Aralık 0 9-17 * * *
/ Adım değeri */10 * * * *

Bu karakterler zaman alanlarını daha esnek kullanmak için vardır.

Temel Zamanlama Örnekleri

Cron ifadesi Anlamı
* * * * * Her dakika
*/5 * * * * Her 5 dakikada bir
0 * * * * Her saat başında
0 7 * * * Her gün 07:00’da
30 18 * * * Her gün 18:30’da
0 0 * * SUN Her Pazar gece yarısı
0 2 1 * * Her ayın 1. günü 02:00’de

Sık Karıştırılan Bir Örnek

Aşağıdaki görev:

7 * * * * /home/ogrenci/bin/yedekle.sh

Her saatin 7. dakikasında çalışır.

Örneğin:

  • 09:07
  • 10:07
  • 11:07

Bu ifade “7 saatte bir” anlamına gelmez.

Daha Kapsamlı Örnekler

Cron ifadesi Anlamı
0 11,16 * * * Her gün 11:00 ve 16:00’da
0 9-18 * * * Her gün 09:00-18:00 arasında saat başı
0 9-18 * * MON-FRI Hafta içi 09:00-18:00 arasında saat başı
*/10 * * * * Her 10 dakikada bir
0 2 1 */2 * İki ayda bir, ayın ilk günü 02:00’de

Zaman alanlarını soldan sağa okumak hata yapmayı azaltır.

Sınıf İçi Alıştırma

Aşağıdaki ifadeler ne zaman çalışır?

Cron ifadesi Anlamı
15 8 * * * ?
0 */2 * * * ?
30 23 * * FRI ?
0 6 1 JAN * ?
*/20 9-17 * * MON-FRI ?

Alıştırma Cevapları

Cron ifadesi Anlamı
15 8 * * * Her gün 08:15’te
0 */2 * * * Her 2 saatte bir, saat başında
30 23 * * FRI Her Cuma 23:30’da
0 6 1 JAN * Her yıl 1 Ocak 06:00’da
*/20 9-17 * * MON-FRI Hafta içi 09:00-17:59 arasında her 20 dakikada bir

Anahtar Kelimelerle Cron Tanımlama

Bazı sık kullanılan zamanlamalar için özel ifadeler vardır.

Anahtar kelime Eşdeğer ifade Anlamı
@hourly 0 * * * * Saatte bir
@daily 0 0 * * * Günde bir
@weekly 0 0 * * 0 Haftada bir
@monthly 0 0 1 * * Ayda bir
@yearly 0 0 1 1 * Yılda bir
@reboot - Sistem açıldıktan sonra bir kez

@reboot Kullanırken

@reboot, sistem açıldıktan sonra komutu bir kez çalıştırır.

@reboot /home/ogrenci/bin/baslangic.sh

Ancak sistem açılmış olsa bile ağ bağlantısı veya bazı servisler henüz hazır olmayabilir.

Basit bir geciktirme gerekiyorsa:

@reboot sleep 30 && /home/ogrenci/bin/baslangic.sh

Daha kontrollü servis bağımlılıkları gerekiyorsa systemd service veya systemd timer daha uygun olabilir.

Pratik Senaryo

Örnek kullanıcı adımız ogrenci olsun.

Amaç:

/home/ogrenci/cron-deneme.log dosyasına her iki dakikada bir tarih bilgisi eklemek.

Betikler için şu dizini kullanacağız:

/home/ogrenci/bin

Eğer bu dizin yoksa oluşturulabilir:

mkdir -p /home/ogrenci/bin

Pratik Örnek: Tek Satırlık Görev

Crontab’ı açalım:

crontab -e

Crontab içine şu satırı ekleyelim:

*/2 * * * * echo "Merhaba Dünya! $(date)" >> /home/ogrenci/cron-deneme.log

Bu görev:

  • Her iki dakikada bir çalışır.
  • echo komutuyla bir satır üretir.
  • Çıktıyı log dosyasının sonuna ekler.

Pratik Örneği Kontrol Etme

Önce görevin kaydedildiğini kontrol edelim:

crontab -l

Birkaç dakika sonra dosyaya bakalım:

cat /home/ogrenci/cron-deneme.log

Görev çalıştıysa dosyaya tarih bilgisiyle birlikte yeni satırlar eklenmiş olur.

Pratik Örnek: Betik Kullanmak

Tek satırlık komut yerine betik kullanmak daha düzenlidir.

Dosya:

nano /home/ogrenci/bin/cron-deneme.sh

İçerik:

#!/bin/bash

echo "Merhaba Dünya! $(date)" >> /home/ogrenci/cron-deneme.log

Çalıştırma izni:

chmod +x /home/ogrenci/bin/cron-deneme.sh

Betiği Cron ile Çalıştırmak

Crontab içine şu satır yazılır:

*/2 * * * * /home/ogrenci/bin/cron-deneme.sh

Bu kullanım daha okunabilir ve yönetilebilir olur.

Özellikle uzun komutlarda betik kullanmak daha doğru bir tercihtir.

Cron ve Ortam Değişkenleri

Cron görevleri, terminaldeki interaktif kabuk ortamıyla aynı ortamda çalışmayabilir.

Bu nedenle:

  • PATH daha sınırlı olabilir.
  • ~/.bashrc veya ~/.profile her zaman okunmaz.
  • Terminalde çalışan komut cron içinde çalışmayabilir.
  • Komutları tam yoluyla yazmak daha güvenlidir.

Örnek:

* * * * * /usr/bin/python3 /home/ogrenci/bin/rapor.py

Betik İçinde PATH Tanımlamak

Bazı durumlarda betiğin başında gerekli yollar açıkça tanımlanabilir.

#!/bin/bash

export PATH="/usr/local/bin:/usr/bin:/bin:$PATH"

/usr/bin/date >> /home/ogrenci/cron-deneme.log

Bu yaklaşım, cron ortamından kaynaklanan yol problemlerini azaltır.

Çıktı Yönetimi

Cron görevi çıktı üretirse bu çıktı varsayılan olarak kullanıcıya e-posta ile gönderilebilir.

Pratikte çıktıyı çoğu zaman açıkça yönlendiririz.

Tüm çıktıyı gizlemek:

* * * * * /home/ogrenci/bin/cron-deneme.sh > /dev/null 2>&1

Tüm çıktıyı log dosyasına eklemek:

* * * * * /home/ogrenci/bin/cron-deneme.sh >> /home/ogrenci/cron-komut.log 2>&1

Burada 2>&1, hata çıktısını normal çıktıyla aynı yere yönlendirir.

Çıktı Yönlendirme Kısa Notu

Linux’ta temel çıktı kanalları:

Kanal Anlamı
STDOUT Normal çıktı
STDERR Hata çıktısı

Örnek:

>> /home/ogrenci/cron-debug.log 2>&1

Bu ifade:

  • Normal çıktıyı log dosyasına ekler.
  • Hata çıktısını da aynı dosyaya yönlendirir.

Cron sorunlarını anlamak için bu yöntem sık kullanılır.

Sistem Geneli Crontab: /etc/crontab

Sistem geneli zamanlanmış görevler /etc/crontab dosyasında tanımlanabilir.

Örnek yapı:

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || run-parts --report /etc/cron.daily

Bu dosya kullanıcı crontab’ından farklıdır.

/etc/crontab Satır Yapısı

/etc/crontab içinde zaman alanlarından sonra kullanıcı adı yazılır.

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

Buradaki root, komutun hangi kullanıcı yetkisiyle çalışacağını belirtir.

Kullanıcı crontab’larında bu alan bulunmaz.

Kullanıcı ve Sistem Crontab’ı Farkı

Özellik Kullanıcı crontab’ı /etc/crontab
Düzenleme crontab -e Dosya editörüyle
Kullanıcı alanı Yok Var
Yetki İlgili kullanıcı Satırda belirtilen kullanıcı
Kullanım amacı Kişisel görevler Sistem geneli görevler

Bu fark özellikle hata ayıklama sırasında önemlidir.

Periyodik Görev Dizinleri

Bazı sistemlerde belirli dizinlere yerleştirilen betikler otomatik olarak çalıştırılır.

Dizin Genel kullanım
/etc/cron.hourly/ Saatlik görevler
/etc/cron.daily/ Günlük görevler
/etc/cron.weekly/ Haftalık görevler
/etc/cron.monthly/ Aylık görevler

Bu dizinlerdeki betikler genellikle /etc/crontab içindeki run-parts satırlarıyla çalıştırılır.

run-parts Nedir?

run-parts, belirtilen dizindeki çalıştırılabilir dosyaları sırayla çalıştıran yardımcı bir komuttur.

Örnek:

run-parts --report /etc/cron.daily

Dikkat edilmesi gerekenler:

  • Betik çalıştırılabilir olmalıdır.
  • Dosya adı sade olmalıdır.
  • Nokta içeren dosya adları bazı sistemlerde çalıştırılmayabilir.
  • Betiklerin çalışma sırası dosya adına bağlı olabilir.

/etc/cron.d/ Dizini

/etc/cron.d/, paketlerin veya sistem yöneticilerinin ayrı cron tanımları koyması için kullanılır.

Bu dizindeki dosyalar /etc/crontab biçimine benzer.

Yani zaman alanlarından sonra kullanıcı adı yazılır.

*/5 * * * * someuser /usr/local/bin/mycommand

Bu satır mycommand komutunu her 5 dakikada bir someuser kullanıcısıyla çalıştırır.

Cron Yöntemlerini Karşılaştırma

İhtiyaç Uygun yöntem
Kendi kullanıcım için görev tanımlayacağım crontab -e
Sistem geneli görev tanımlayacağım /etc/crontab veya /etc/cron.d/
Bir betik her gün otomatik çalışsın /etc/cron.daily/
Bir paketin kendi cron tanımı olsun /etc/cron.d/
Görev belirli kullanıcı yetkisiyle çalışsın /etc/crontab veya /etc/cron.d/

Basit kullanıcı görevleri için genellikle crontab -e yeterlidir.

Cron Kullanımını Sınırlamak

Sistem yöneticisi, hangi kullanıcıların cron kullanabileceğini sınırlayabilir.

Bunun için bazı sistemlerde şu dosyalar kullanılır:

/etc/cron.allow
/etc/cron.deny

Genel mantık:

  • cron.allow varsa yalnızca bu dosyadaki kullanıcılar cron kullanabilir.
  • cron.allow yoksa cron.deny içindeki kullanıcılar engellenir.
  • İki dosya da yoksa davranış dağıtıma ve cron uygulamasına göre değişebilir.

Bu konu özellikle çok kullanıcılı sistemlerde önemlidir.

Sorun Giderme: Servis ve Loglar

Bir cron görevi çalışmıyorsa önce cron servisinin durumuna bakılır.

Debian/Ubuntu sistemlerde:

systemctl status cron

Bazı dağıtımlarda servis adı crond olabilir.

Log kontrolü:

grep CRON /var/log/syslog

veya:

journalctl -u cron

Sorun Giderme: Yol, İzin ve Manuel Test

Kontrol edilmesi gerekenler:

  • Komut tam yoluyla yazılmış mı?
  • Betiğin çalıştırma izni var mı?
  • Görevi çalıştıran kullanıcının gerekli dosyalara erişim yetkisi var mı?
  • Betik içinde kullanılan dosya yolları mutlak mı?

Manuel test:

sudo -u ogrenci /home/ogrenci/bin/cron-deneme.sh

Çıktı yakalama:

* * * * * /home/ogrenci/bin/cron-deneme.sh >> /home/ogrenci/cron-debug.log 2>&1

crontab.guru: Zamanlama Yardımcısı

Cron ifadelerini yazmak veya kontrol etmek için kullanılabilecek basit bir çevrimiçi araçtır.

https://crontab.guru

Örneğin şu ifade yazıldığında ne zaman çalışacağını açıklayabilir:

*/15 9-17 * * MON-FRI

Bu tür araçlar öğrenme ve doğrulama için yararlıdır.

Cron Dışındaki Seçenekler

Linux’ta zamanlanmış görevler için tek seçenek cron değildir.

Araç Kullanım
at Tek seferlik zamanlanmış görevler
anacron Makine kapalıyken kaçan periyodik görevleri telafi etmek
systemd timer Systemd tabanlı sistemlerde servis mantığıyla zamanlama

Modern Linux sistemlerinde birçok bakım görevi artık systemd timer ile yönetilir.

systemd timer, servis bağımlılıkları ve loglama açısından cron’a göre daha kontrollü bir yapı sunabilir.

Kısa Özet

  • cron, zamanlanmış görevleri çalıştıran servistir.
  • crontab, görevlerin tanımlandığı yapıdır.
  • Kullanıcı crontab’ında kullanıcı adı yazılmaz.
  • /etc/crontab ve /etc/cron.d/ içinde kullanıcı alanı bulunur.
  • Cron ifadelerinde sayıların yanında MON-FRI, JAN gibi adlar da kullanılabilir.
  • Cron görevlerinde tam yol, izinler ve çıktı yönlendirme önemlidir.
  • @reboot kullanırken servislerin hazır olup olmadığı düşünülmelidir.
  • Sorun giderirken servis durumu, loglar, izinler ve manuel test birlikte kontrol edilmelidir.

Kaynaklar