11 - Zamanlanmış Görevler
2026
Bazı işlemlerin belirli zamanlarda otomatik çalışması gerekebilir.
Örneğin:
Linux sistemlerinde bu tür işler için yaygın olarak cron kullanılır.
Bir komutu terminalden elle çalıştırabiliriz.
Ancak bazı durumlarda bu yeterli değildir:
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.
Kısaca:
cron çalıştırır, crontab görevleri tanımlar.
| 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.
Her kullanıcının kendisine ait bir crontab dosyası olabilir.
Görevleri düzenlemek için:
Görevleri listelemek için:
Tüm görevleri silmek için:
crontab -r dikkatli kullanılmalıdır; kullanıcının tüm cron görevlerini siler.
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:
Kalıcı olarak tercih edilen editör değiştirilebilir; ancak bu derste geçici kullanım yeterlidir.
Değişiklik yapmadan önce mevcut görevleri yedeklemek iyi bir alışkanlıktır.
Bazı sistemlerde silme öncesi onay almak için:
crontab -i her sistemde desteklenmeyebilir. Desteklenmiyorsa en güvenli yol önce yedek almaktır.
Root yetkisiyle başka bir kullanıcının cron görevleri düzenlenebilir.
Listeleme:
Düzenleme:
Kullanıcı crontab’larında satıra ayrıca kullanıcı adı yazılmaz.
Komutlar ilgili kullanıcının yetkileriyle çalışır.
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.
| 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.
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.
| 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.
| 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 |
Aşağıdaki görev:
7 * * * * /home/ogrenci/bin/yedekle.sh
Her saatin 7. dakikasında çalışır.
Örneğin:
Bu ifade “7 saatte bir” anlamına gelmez.
| 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.
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 |
? |
| 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 |
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.
Ö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:
Crontab’ı açalım:
Crontab içine şu satırı ekleyelim:
*/2 * * * * echo "Merhaba Dünya! $(date)" >> /home/ogrenci/cron-deneme.log
Bu görev:
echo komutuyla bir satır üretir.Önce görevin kaydedildiğini kontrol edelim:
Birkaç dakika sonra dosyaya bakalım:
Görev çalıştıysa dosyaya tarih bilgisiyle birlikte yeni satırlar eklenmiş olur.
Tek satırlık komut yerine betik kullanmak daha düzenlidir.
Dosya:
İçerik:
Çalıştırma izni:
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 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.Örnek:
* * * * * /usr/bin/python3 /home/ogrenci/bin/rapor.py
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.logBu yaklaşım, cron ortamından kaynaklanan yol problemlerini azaltır.
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.
Linux’ta temel çıktı kanalları:
| Kanal | Anlamı |
|---|---|
STDOUT |
Normal çıktı |
STDERR |
Hata çıktısı |
Örnek:
>> /home/ogrenci/cron-debug.log 2>&1
Bu ifade:
Cron sorunlarını anlamak için bu yöntem sık kullanılır.
/etc/crontabSistem 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.
| Ö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.
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:
Dikkat edilmesi gerekenler:
/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.
| İ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.
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.Bu konu özellikle çok kullanıcılı sistemlerde önemlidir.
Bir cron görevi çalışmıyorsa önce cron servisinin durumuna bakılır.
Debian/Ubuntu sistemlerde:
Bazı dağıtımlarda servis adı crond olabilir.
Log kontrolü:
veya:
Kontrol edilmesi gerekenler:
Manuel test:
Çı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.
Ö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.
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.
cron, zamanlanmış görevleri çalıştıran servistir.crontab, görevlerin tanımlandığı yapıdır./etc/crontab ve /etc/cron.d/ içinde kullanıcı alanı bulunur.MON-FRI, JAN gibi adlar da kullanılabilir.@reboot kullanırken servislerin hazır olup olmadığı düşünülmelidir.man 5 crontabman crontab