15%

Tüm Hosting Hizmetlerinde %15 indirim

Becerilerini test et ve herhangi bir hosting planında İndirim kazan

Kodu kullanın:

Skills
Başlayın
24.10.2024
1 +1

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 -e aracı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 user alanı içeren /etc/crontab dosyası
  • 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/anacrontab dosyası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ısayolEşdeğeriAnlamı
@rebootDaemon başlangıcında bir kez çalıştır
@yearly0 0 1 1 *Yılda bir kez
@monthly0 0 1 * *Her ayın ilk günü
@weekly0 0 * * 0Her Pazar gece yarısı
@daily0 0 * * *Her gün gece yarısı
@hourly0 * * * *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 -l

Bu, 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>&1

Bu örnekte:

  • backup.sh her gün gece yarısı çalışır
  • cleanup.sh her Pazar 02:30’da çalışır
  • health-check.sh 00: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 john

john 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
done

2>/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/crontab

Debian 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/anacrontab

Anacron 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 --all

Eksiksiz 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-pager

Cron İş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 -e

Root olarak başka bir kullanıcının crontab’ını düzenlemek için:

sudo crontab -e -u username

Mevcut kullanıcının tüm cron işlerini kaldırmak için (dikkatli kullanın — yedek olmadan geri alınamaz):

crontab -r

Değişiklik yapmadan önce bir crontab yedeklemek için:

crontab -l > ~/crontab_backup_$(date +%F).txt

Dü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ı

ÖzellikCronSystemd Timer’ları
Yapılandırma biçimiDüz metin, beş alanlı sözdizimiUnit dosyaları (.timer + .service)
Kullanıcı başına zamanlamaEvet, kullanıcı crontab’ları aracılığıylaEvet, kullanıcı düzeyinde systemd örnekleri aracılığıyla
Kaçırılan iş yönetimiHayır (sistem kapalıysa iş atlanır)Evet, Persistent=true ile
GünlüklemeSyslog / postaJournald (journalctl ile sorgulanabilir)
Bağımlılık yönetimiYokTam systemd bağımlılık grafiği
Rastgele gecikmeYerleşik değil (sleep $RANDOM gerektirir)RandomizedDelaySec=
KarmaşıklıkDüşükOrta
KullanılabilirlikTüm Unix/Linux sistemleriYalnı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 listelecrontab -l
Başka bir kullanıcının işlerini listelesudo crontab -l -u username
Tüm kullanıcıların işlerini listelefor u in $(cut -d: -f1 /etc/passwd); do sudo crontab -l -u "$u" 2>/dev/null; done
Sistem crontab’ını görüntülecat /etc/crontab
cron.d işlerini listelels /etc/cron.d/
Spool dizinini görüntülels /var/spool/cron/crontabs/
Anacron işlerini görüntülecat /etc/anacrontab
Systemd timer’larını listelesystemctl list-timers --all
Mevcut kullanıcının crontab’ını düzenlecrontab -e
Mevcut kullanıcının crontab’ını kaldırcrontab -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.sh

Saat 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 -50

Systemd tabanlı sistemlerde:

journalctl -u cron --since "1 hour ago"

Bir iş çalışmıyorsa şunları kontrol edin:

  1. Cron daemon’u etkin: systemctl status cron (veya RHEL tabanlı sistemlerde crond)
  2. Betiğin çalıştırılabilir olduğu ve yolun doğru olduğu
  3. Zaman alanlarının sözdizimsel olarak geçerli olduğu
  4. Çıktının sessizce atılmadığı — geçici olarak >> /tmp/job.log 2>&1 ekleyin
  5. İş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 otomasyonKullanı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 betiklerAnacron (/etc/anacrontab)
Karmaşık bağımlılıklara veya servis sıralamasına sahip görevlerSystemd timer’ları
Bir paketle birlikte dağıtılan uygulama düzeyindeki işler/etc/cron.d/<package-name>
Konteynerleştirilmiş ortamlarSupervisor + cron veya Kubernetes CronJob

Pratik Temel Çıkarım Kontrol Listesi

  • Kendi işlerinizi denetlemek için crontab -l komutunu çalıştırın; çok kiracılı bir sunucudaki her kullanıcıyı denetlemek için for döngü kalıbını kullanın.
  • Her zaman /etc/crontab, /etc/cron.d/ ve systemctl list-timers --all dosyalarını kontrol edin — crontab -l tek 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.txt ile yedekleyin.
  • Uzun süre çalışan işlerin eş zamanlı yürütülmesini önlemek için flock kullanın.
  • Systemd sistemlerinde, yalnızca /var/log/syslog‘a güvenmek yerine journalctl -u cron komutunu 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.

15%

Tüm Hosting Hizmetlerinde %15 indirim

Becerilerini test et ve herhangi bir hosting planında İndirim kazan

Kodu kullanın:

Skills
Başlayın