Cron Job’ları Crontab Kullanarak Görüntüleme ve Listeleme
crontab komutu, Unix cron sisteminde zamanlanmış görevleri görüntülemek, düzenlemek ve yönetmek için birincil arayüzdür. Şu anda oturum açmış kullanıcının tüm cron işlerini listelemek için herhangi bir terminalde crontab -l komutunu çalıştırın. Root veya sistem genelindeki işler için /etc/crontab, /etc/cron.d/ ve /var/spool/cron/crontabs/ dosyalarını doğrudan inceleyin.
Cron, Linux ve Unix benzeri sistemlerde görev otomasyonunun temel taşıdır. İster bir VPS Hosting ortamında gecelik veritabanı yedeklemeleri çalıştırıyor, ister bir Dedicated Server üzerinde günlükleri döndürüyor, ister Certbot aracılığıyla SSL Sertifikalarını otomatik olarak yeniliyor olun, bir makinedeki tüm zamanlanmış işleri denetlemeyi ve listelemeyi anlamak vazgeçilmez bir sistem yöneticisi becerisidir. Bu kılavuz, cron yığınının her katmanını — kullanıcı crontab’ları, sistem crontab’ları, drop-in dizinleri ve spool — deneyimli mühendisleri bile tökezleten gerçek dünya tuzaklarıyla birlikte kapsamaktadır.
Crontab Nedir ve Cron Sistemi Nasıl Çalışır
Crontab (“cron tablosu”nun kısaltması), crond daemon’una hangi komutların ne zaman çalıştırılacağını bildiren, kullanıcı başına bir yapılandırma dosyasıdır. Bir sistemdeki her kullanıcı hesabı — root dahil — bağımsız bir crontab tutabilir. Daemon bu dosyaları başlangıçta ve her düzenlemeden sonra okur, ardından işleri zaman belirtimlerine göre gönderir.
Modern bir Linux dağıtımındaki cron ekosistemi birkaç farklı katmandan oluşur:
- Kullanıcı crontab’ları —
crontab -earacılığıyla yönetilir ve/var/spool/cron/crontabs/(Debian/Ubuntu) veya/var/spool/cron/(RHEL/CentOS) konumunda saklanır - Sistem crontab’ı — her giriş için ekstra bir
useralanı içeren/etc/crontabdosyası - Drop-in dizini — paketlerin kendi iş tanımlarını kurduğu
/etc/cron.d/ - Run-parts dizinleri — crontab sözdizimi dosyaları yerine çalıştırılabilir betikler içeren
/etc/cron.hourly/,/etc/cron.daily/,/etc/cron.weekly/,/etc/cron.monthly/ - Anacron — 7/24 çalışmayan makinelerdeki işleri yöneten,
/etc/anacrontabdosyasından okuyan bir cron tamamlayıcısı
Bir işin hangi katmanda bulunduğunu anlamak, sunucu denetimi sırasında kritik öneme sahiptir; çünkü crontab -l tek başına tipik bir üretim sistemindeki zamanlanmış görevlerin büyük çoğunluğunu gözden kaçıracaktır.
Crontab Zaman Alanı Sözdizimi
Her crontab girişi, komuttan önce sabit beş alanlı bir zaman belirtimini takip eder:
* * * * * command_to_execute
| | | | |
| | | | +----- day of the week (0–7, Sunday = 0 or 7)
| | | +------- month (1–12)
| | +--------- day of the month (1–31)
| +----------- hour (0–23)
+------------- minute (0–59)Çoğu cron uygulaması tarafından desteklenen özel sözdizimi kısayolları:
| Kısayol | Eşdeğeri | Anlamı |
|---|---|---|
@reboot | — | Daemon başlangıcında bir kez çalıştır |
@yearly | 0 0 1 1 * | Yılda bir kez |
@monthly | 0 0 1 * * | Her ayın ilk günü |
@weekly | 0 0 * * 0 | Her Pazar gece yarısı |
@daily | 0 0 * * * | Her gün gece yarısı |
@hourly | 0 * * * * | Her saatin başında |
/etc/crontab ve /etc/cron.d/ dosyaları, zaman belirtimi ile komutun kendisi arasına altıncı bir alan ekler — komutun çalıştırıldığı kullanıcı adı.
Cron İşleri Nasıl Listelenir: Tüm Yöntemler Açıklandı
1. Kendi Kullanıcı Cron İşlerinizi Görüntüleme
crontab -lBu, komutu çalıştıran kullanıcının crontab’ını yazdırır. Henüz bir crontab yoksa boş bir çıktı veya no crontab for <username> mesajı görürsünüz — her ikisi de normaldir.
Örnek çıktı:
# m h dom mon dow command
0 0 * * * /home/deploy/backup.sh
30 2 * * 7 /home/deploy/scripts/cleanup.sh
15 */4 * * * /usr/local/bin/health-check.sh >> /var/log/health.log 2>&1Bu örnekte:
backup.shher gün gece yarısı çalışırcleanup.shher Pazar 02:30’da çalışırhealth-check.sh00:15’ten başlayarak her dört saatte bir çalışır; hem stdout hem de stderr bir günlük dosyasına yönlendirilir
Tuzak: Çıktı yönlendirmesi (>>, 2>&1) crontab girişlerinde sıklıkla atlanır. Bu olmadan cron, çıktıyı sendmail aracılığıyla yerel kullanıcıya e-posta ile göndermeye çalışır. Posta aktarım aracısı olmayan sunucularda bu, tüm çıktıyı sessizce atar ve hata ayıklamayı neredeyse imkânsız kılar. Her zaman yönlendirin veya crontab’ın en üstüne MAILTO="" ayarlayın.
2. Başka Bir Kullanıcının Cron İşlerini Listeleme
sudo veya root erişimiyle herhangi bir kullanıcının crontab’ını inceleyebilirsiniz:
sudo crontab -l -u johnjohn yerine hedef kullanıcı adını yazın. Bu, ham spool dosyasını okumakla işlevsel olarak aynıdır; ancak uygun kilitleme mekanizmasını kullandığından doğrudan dosya erişimine her zaman tercih edilir.
3. Tüm Kullanıcı Crontab’larını Aynı Anda Listeleme
Çok kullanıcılı bir sunucuda, eksiksiz bir tablo elde etmenin tek güvenilir yolu her hesabı tek tek dolaşmaktır:
for user in $(cut -f1 -d: /etc/passwd); do
echo "=== Crontab for: $user ==="
sudo crontab -l -u "$user" 2>/dev/null
done2>/dev/null seçeneği, crontab’ı olmayan kullanıcılar için “no crontab for” mesajlarını bastırarak çıktıyı temiz tutar.
4. Sistem Genelindeki Crontab’ı Görüntüleme
cat /etc/crontabDebian tabanlı bir sistemde tipik çıktı:
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 || ( 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 )test -x /usr/sbin/anacron korumasına dikkat edin: anacron kuruluysa bu run-parts çağrıları atlanır ve günlük, haftalık ve aylık işlerin sorumluluğunu anacron üstlenir. Bu, işlerin zamanında çalışmadığı görüldüğünde yaygın bir karışıklık kaynağıdır.
5. /etc/cron.d/ İçindeki İşleri Listeleme
ls -la /etc/cron.d/Dizindeki her dosyanın içeriğini tek seferde incelemek için:
grep -v '^#|^$' /etc/cron.d/*Bu, yorum satırlarını ve boş satırları kaldırarak yalnızca etkin iş tanımlarını gösterir. Paket yöneticileri buraya sıklıkla dosya bırakır — yaygın örnekler arasında sysstat, logrotate geçersiz kılmaları ve izleme aracıları sayılabilir.
6. Cron Spool Dizinini Doğrudan İnceleme
ls -la /var/spool/cron/crontabs/RHEL, CentOS ve Fedora’da yol, crontabs alt dizini olmaksızın /var/spool/cron/ şeklindedir. Belirli bir kullanıcının ham spool dosyasını okumak için:
sudo cat /var/spool/cron/crontabs/usernameÖnemli: Spool dosyalarını asla doğrudan bir metin düzenleyiciyle düzenlemeyin. crontab -e komutu, dosya kilitleme kullanır ve yeni dosyayı kurmadan önce sözdizimini doğrular. Doğrudan düzenlemeler dosyayı bozabilir veya crond‘ın dosyayı tamamen yok sayacağı bir duruma getirebilir.
7. Anacron İşlerini Listeleme
Sistem dayanıklı zamanlama için anacron kullanıyorsa:
cat /etc/anacrontabAnacron girişleri, standart beş alanlı cron biçimi yerine farklı bir sözdizimi kullanır — gün cinsinden dönem, dakika cinsinden gecikme, iş tanımlayıcısı ve komut.
8. Systemd Timer’larını Kontrol Etme (Modern Alternatif)
Systemd tabanlı dağıtımlarda, tarihsel olarak cron tarafından yönetilen birçok görev artık systemd timer’ları tarafından yönetilmektedir. Bunlar hiçbir crontab listesinde görünmez:
systemctl list-timers --allEksiksiz bir sunucu denetimi hem cron hem de systemd timer kontrollerini içermelidir. Bunu yapmamak, güvenlik ve uyumluluk incelemelerindeki en yaygın eksikliklerden biridir.
Eksiksiz Cron Denetimi: Tek Seferlik Komut
Bir sistemdeki tüm zamanlanmış görevlerin hızlı ve kapsamlı bir denetimi için tüm kaynakları birleştirin:
echo "=== /etc/crontab ===" && cat /etc/crontab
echo "=== /etc/cron.d/ ===" && ls /etc/cron.d/ && grep -rh '' /etc/cron.d/
echo "=== User crontabs ===" && for u in $(cut -d: -f1 /etc/passwd); do sudo crontab -l -u "$u" 2>/dev/null && echo " ^ user: $u"; done
echo "=== Systemd timers ===" && systemctl list-timers --all --no-pagerCron İşlerini Düzenleme ve Yönetme
Kendi crontab’ınızı sistemin varsayılan düzenleyicisinde ($VISUAL veya $EDITOR, yoksa vi) açmak için:
crontab -eRoot olarak başka bir kullanıcının crontab’ını düzenlemek için:
sudo crontab -e -u usernameMevcut kullanıcının tüm cron işlerini kaldırmak için (dikkatli kullanın — yedek olmadan geri alınamaz):
crontab -rDeğişiklik yapmadan önce bir crontab yedeklemek için:
crontab -l > ~/crontab_backup_$(date +%F).txtDüzenlemeden önce her zaman yedek alın. crontab -e‘da yerleşik bir geri alma işlevi yoktur.
Cron ile Systemd Timer’ları: Özellik Karşılaştırması
| Özellik | Cron | Systemd Timer’ları |
|---|---|---|
| Yapılandırma biçimi | Düz metin, beş alanlı sözdizimi | Unit dosyaları (.timer + .service) |
| Kullanıcı başına zamanlama | Evet, kullanıcı crontab’ları aracılığıyla | Evet, kullanıcı düzeyinde systemd örnekleri aracılığıyla |
| Kaçırılan iş yönetimi | Hayır (sistem kapalıysa iş atlanır) | Evet, Persistent=true ile |
| Günlükleme | Syslog / posta | Journald (journalctl ile sorgulanabilir) |
| Bağımlılık yönetimi | Yok | Tam systemd bağımlılık grafiği |
| Rastgele gecikme | Yerleşik değil (sleep $RANDOM gerektirir) | RandomizedDelaySec= |
| Karmaşıklık | Düşük | Orta |
| Kullanılabilirlik | Tüm Unix/Linux sistemleri | Yalnızca systemd tabanlı Linux |
Eski ortamlar ve konteynerler dahil olmak üzere herhangi bir Unix sisteminde basit, zamana dayalı otomasyon için cron en taşınabilir ve operasyonel olarak en basit seçenek olmaya devam etmektedir. Systemd timer’ları, bağımlılık sıralamasına, güvenilir kaçırılan iş yürütmeye veya yapılandırılmış günlük çıktısına ihtiyaç duyduğunuzda üstündür.
Yaygın Crontab Listeleme Komutları: Hızlı Başvuru
| Amaç | Komut |
|---|---|
| Mevcut kullanıcının işlerini listele | crontab -l |
| Başka bir kullanıcının işlerini listele | sudo crontab -l -u username |
| Tüm kullanıcıların işlerini listele | for u in $(cut -d: -f1 /etc/passwd); do sudo crontab -l -u "$u" 2>/dev/null; done |
| Sistem crontab’ını görüntüle | cat /etc/crontab |
| cron.d işlerini listele | ls /etc/cron.d/ |
| Spool dizinini görüntüle | ls /var/spool/cron/crontabs/ |
| Anacron işlerini görüntüle | cat /etc/anacrontab |
| Systemd timer’larını listele | systemctl list-timers --all |
| Mevcut kullanıcının crontab’ını düzenle | crontab -e |
| Mevcut kullanıcının crontab’ını kaldır | crontab -r |
Gerçek Dünya Tuzakları ve Uç Durumlar
Ortam değişkenleri miras alınmaz. Cron, işleri minimal bir kabuk ortamında çalıştırır. .bashrc veya .profile dosyanızda ayarlanan PATH, HOME ve LANG gibi değişkenler kullanılamaz. Komutlar ve ikili dosyalar için her zaman mutlak yollar kullanın ya da crontab’ın en üstünde PATH‘ı açıkça tanımlayın.
MAILTO değişkeni çıktı yönlendirmesini kontrol eder. Çıktıyı atmak için MAILTO="" olarak ayarlayın veya belirli bir adrese yönlendirmek için MAILTO="admin@example.com" kullanın. Yapılandırılmış bir MTA olmadan, işlenmeyen çıktı sessiz hatalara neden olur.
Betiklerdeki izinler önemlidir. Etkileşimli olarak sorunsuz çalışan bir betik, çalıştırılabilir değilse (chmod +x) veya cron kullanıcısının okuyamadığı dosyalara başvuruyorsa cron altında başarısız olabilir.
Çakışan iş yürütme. Bir iş aralığından daha uzun sürerse birden fazla örnek eş zamanlı olarak çalışır. Bunu önlemek için bir kilit dosyası veya flock kullanın:
0 * * * * /usr/bin/flock -n /tmp/myjob.lock /home/user/long-running-job.shSaat dilimi farkındalığı. Cron varsayılan olarak sistem saat dilimini kullanır. VPS Hosting ve Dedicated Server‘larda standart uygulama olan sistem saati olarak UTC ayarlı sunucularda, zamanlanmış saatlerinizin farkı hesaba kattığından emin olun. Bazı cron uygulamaları, crontab başına bir CRON_TZ değişkenini destekler.
Crontab sözdizimi doğrulaması. Üretimde yeni bir crontab girişi dağıtmadan önce, zamanlamanın amacınızla örtüştüğünü doğrulamak için crontab.guru gibi bir araç kullanarak ifadeyi doğrulayın.
Cron İşi Günlükleme ve Hata Ayıklama
Varsayılan olarak cron, iş yürütmesini syslog’a kaydeder. Son cron etkinliğini görüntülemek için:
grep CRON /var/log/syslog | tail -50Systemd tabanlı sistemlerde:
journalctl -u cron --since "1 hour ago"Bir iş çalışmıyorsa şunları kontrol edin:
- Cron daemon’u etkin:
systemctl status cron(veya RHEL tabanlı sistemlerdecrond) - Betiğin çalıştırılabilir olduğu ve yolun doğru olduğu
- Zaman alanlarının sözdizimsel olarak geçerli olduğu
- Çıktının sessizce atılmadığı — geçici olarak
>> /tmp/job.log 2>&1ekleyin - İşi çalıştıran kullanıcının komutu yürütme iznine sahip olduğu
cPanel’li bir VPS‘te karmaşık otomasyon yığınlarını yönetirken cPanel, Gelişmiş bölümünde doğrudan kullanıcının crontab’ına yazan grafiksel bir Cron İşleri arayüzü sunar. cPanel aracılığıyla eklenen işler crontab -l ile tamamen görünürdür ve manuel olarak eklenen girişlerle aynı şekilde davranır.
Karar Matrisi: Hangi Cron Katmanı Kullanılmalı
| Kullanım Durumu | Önerilen Katman |
|---|---|
| Tek bir kullanıcı için kişisel otomasyon | Kullanıcı crontab’ı (crontab -e) |
| Sistem bakım görevleri (yedeklemeler, günlük döndürme) | /etc/cron.d/ veya /etc/crontab |
| Kaçırılan zamanlamadan sonra bile çalışması gereken betikler | Anacron (/etc/anacrontab) |
| Karmaşık bağımlılıklara veya servis sıralamasına sahip görevler | Systemd timer’ları |
| Bir paketle birlikte dağıtılan uygulama düzeyindeki işler | /etc/cron.d/<package-name> |
| Konteynerleştirilmiş ortamlar | Supervisor + cron veya Kubernetes CronJob |
Pratik Temel Çıkarım Kontrol Listesi
- Kendi işlerinizi denetlemek için
crontab -lkomutunu çalıştırın; çok kiracılı bir sunucudaki her kullanıcıyı denetlemek içinfordöngü kalıbını kullanın. - Her zaman
/etc/crontab,/etc/cron.d/vesystemctl list-timers --alldosyalarını kontrol edin —crontab -ltek başına eksik bir tablo sunar. - Crontab girişlerindeki tüm komutlar ve ikili dosyalar için mutlak yollar kullanın.
- MTA olmayan sunucularda sessiz hataları önlemek için
MAILTO=""ayarlayın veya çıktıyı açıkça yönlendirin. - Herhangi bir düzenleme oturumundan önce crontab’ınızı
crontab -l > backup.txtile yedekleyin. - Uzun süre çalışan işlerin eş zamanlı yürütülmesini önlemek için
flockkullanın. - Systemd sistemlerinde, yalnızca
/var/log/syslog‘a güvenmek yerinejournalctl -u cronkomutunu kontrol edin. - Üretime dağıtmadan önce yeni zaman ifadelerini çevrimiçi bir cron ifadesi test aracıyla doğrulayın.
- Bulut ve VPS Hosting örneklerinde UTC ile yerel saat dilimi farkını hesaba katın.
- E-posta Hosting sunucuları veya işlerin kritik öneme sahip olduğu herhangi bir altyapı için, sessiz cron hatalarını tespit etmek amacıyla harici izleme (örn. healthcheck ping’leri) uygulayın.
SSS
Bir Linux sunucusundaki her kullanıcının tüm cron işlerini nasıl listeleyebilirim?
/etc/passwd üzerinde yineleyin ve “no crontab” hatalarını 2>/dev/null ile bastırarak her hesap için sudo crontab -l -u <user> komutunu çağırın. Ayrıca /etc/crontab ve /etc/cron.d/ dosyalarını inceleyin ve sistem düzeyindeki ile systemd tarafından yönetilen işleri yakalamak için systemctl list-timers --all komutunu çalıştırın.
İşler çalışıyor olmasına rağmen neden crontab -l hiçbir şey göstermiyor?
İşler büyük olasılıkla /etc/crontab dosyasında, /etc/cron.d/ içindeki bir dosyada veya systemd timer’ları olarak tanımlanmıştır — bunların hiçbiri crontab -l aracılığıyla görünmez. Bu komut yalnızca spool dizininde saklanan çağıran kullanıcının kişisel crontab’ını gösterir.
/etc/crontab ile /etc/cron.d/ arasındaki fark nedir?
Her ikisi de aynı altı alanlı sözdizimini (kullanıcı adı alanı dahil) kullanır ve sistem cron daemon’u tarafından okunur. /etc/crontab, manuel sistem yönetimi için tasarlanmış tek parçalı bir dosyadır. /etc/cron.d/ ise paketlerin veya servislerin kendi iş dosyalarını kurduğu, bunları izole tutarak bağımsız olarak yönetmeyi veya kaldırmayı kolaylaştıran bir drop-in dizinidir.
Bir cron işinin birden fazla çakışan örnek çalıştırmasını nasıl önleyebilirim?
Engelleyici olmayan özel bir kilit edinmek için komutu flock -n /tmp/lockfile.lock ile sarın. Önceki bir örnek hâlâ çalışıyorsa yeni çağrı, komutu yürütmeden hemen çıkar; bu sayede kaynak çekişmesi ve veri bozulması önlenir.
Cron iş günlükleri nerede saklanır ve çalışmayan bir işin hatasını nasıl ayıklarım?
Çoğu sistemde cron, /var/log/syslog dosyasına kaydeder (grep CRON ile filtreleyin) veya journald aracılığıyla (journalctl -u cron). Hata ayıklama için tüm çıktıyı yakalamak amacıyla iş komutuna geçici olarak >> /tmp/debug.log 2>&1 ekleyin, betiğin çalıştırılabilir olduğunu doğrulayın, daemon’un systemctl status cron ile çalıştığını onaylayın ve zaman ifadesini bağımsız olarak doğrulayın.
