Cron Job Loglama: Hataları Tespit Etme ve Debug Rehberi

LogYayın: Güncellendi: 6 dk okumaHazırlayan: cronjob.com.tr Editörleri

Cron job sorunlarının çoğu "çalışmıyor" sanılır; oysa cron komutu başlatmış, script sessizce hata vermiştir. Sistem logları yalnızca tetiklemeyi gösterir; gerçek çıktı (stdout/stderr) ve exit kodu sizin yönlendirmenize bağlıdır. Bu rehber log konumlarını, özel dosyaya yönlendirmeyi, script içi loglamayı, e-posta bildirimini ve log rotasyonunu adım adım anlatır.

Dağıtıma göre dosya yolu değişir: Debian/Ubuntu'da /var/log/syslog veya yalnızca journalctl; RHEL ailesinde /var/log/cron. Modern Debian 12 / Ubuntu kurulumlarında rsyslog olmayabilir; o zaman /var/log/syslog yoktur ve journal tek kaynaktır. Cron job çalışmıyor teşhisinde ilk adım da bu kayıtlarda CMD aramaktır.

Aşağıdaki yöntemler kişisel crontab, /etc/crontab ve /etc/cron.d/ için geçerlidir. Sözdizimini doğrulamak için crontab sözdizimi rehberine ve ifade üreticisine bakabilirsiniz.

Cron Log Konumları (Dağıtıma Göre)

SistemDosya / komutNot
Debian / Ubuntu (rsyslog var)/var/log/sysloggrep CRON ile filtreleyin
Debian 12+ / journal-onlyjournalctl -u cronsyslog dosyası olmayabilir
CentOS / RHEL / Rocky / Alma/var/log/cronrsyslog cron.* kuralı
RHEL ailesi (systemd)journalctl -u crondBirim adı crond
# Debian / Ubuntu
sudo grep CRON /var/log/syslog | tail -40
sudo journalctl -u cron --since "today"

# RHEL ailesi
sudo tail -40 /var/log/cron
sudo journalctl -u crond --since "2 hours ago"

# Canlı izleme
sudo journalctl -u cron -f

Tipik satır: CRON[9876]: (www-data) CMD (/usr/bin/php /var/www/cron.php). Bu kayıt exit kodunu ve script mesajını içermez; yalnızca "cron bu komutu başlattı" der. Aynı dakikada birden fazla satır görmek normaldir: sistem cron.daily işleri ile kişisel crontab yan yana yazılır. Parantez içindeki kullanıcı adı, görevin hangi hesapla başlatıldığını gösterir; yanlış kullanıcıda CMD arıyorsanız boş sonuç alırsınız.

Not: journalctl "No journal files were found" derse çoğu zaman sudo eksiktir veya erişilebilir journal kaydı yoktur. Kalıcılık için /var/log/journal oluşturulup systemd-journald yeniden başlatılır; üretimde disk planını da gözetin. Ubuntu'da rsyslog kuruluysa /etc/rsyslog.d/50-default.conf içindeki cron.* satırını açarak ayrı /var/log/cron.log da üretebilirsiniz.

Adım Adım: Görev Çıktısını Loglamak

  1. Hedef log dosyasını ve dizinini oluşturun; crontab kullanıcısının yazabildiğinden emin olun.
  2. Crontab satırına >> /var/log/gorev.log 2>&1 ekleyin (>> ekler, 2>&1 stderr'ı stdout'a birleştirir).
  3. Bir sonraki tetiklemeden sonra dosyayı okuyun: tail -50 /var/log/gorev.log.
  4. Exit kodunu script sonunda loglayın veya wrapper kullanın.
  5. Şişmeyi önlemek için logrotate tanımlayın (aşağıda).
sudo mkdir -p /var/log/app-cron
sudo touch /var/log/app-cron/gorev.log
sudo chown deploy:deploy /var/log/app-cron/gorev.log

# crontab -e
0 3 * * * /home/deploy/scripts/gorev.sh >> /var/log/app-cron/gorev.log 2>&1

% karakterini crontab'da kaçırmayı unutmayın; aksi halde satır bölünür ve log yönlendirmesi de bozulur. Tarih damgası için \%Y kullanın veya damgayı script içine taşıyın.

Script İçinde Loglama ve Debug

Yönlendirme tek başına yetmezse script'te aşama logu yazın. set -x ile izleme satırları üretir; üretimde kalıcı set -x gürültülü olabilir, teşhis için açıp kapatın.

#!/bin/bash
set -euo pipefail
LOG="/var/log/app-cron/gorev.log"
log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" >> "$LOG"; }

log "basladi"
rc=0
/usr/bin/php /var/www/site/bin/cleanup.php || rc=$?
log "bitti exit=$rc"
exit "$rc"

Manuel teşhis: bash -x /home/deploy/scripts/gorev.sh 2>&1 | tee /tmp/gorev-debug.txt. Cron ortamını taklit: env -i HOME=/home/deploy LOGNAME=deploy PATH=/usr/bin:/bin /bin/bash /home/deploy/scripts/gorev.sh.

Gerçek Senaryolar

Senaryo 1: syslog'da CMD var, klasör boş

Her gece 03:00'te yedek script'i için CMD görünür; /yedek boştur. Özel log eklenince Permission denied ve mysqldump: Got error: 1045 çıkar. Sistem logu "çalıştı" der; asıl hata uygulama çıktısındadır. Çözüm: yazılabilir log + doğru DB kullanıcısı; ayrıntılı izin için permission denied rehberi.

Senaryo 2: Debian 12'de /var/log/syslog yok

Yeni sunucuda grep CRON /var/log/syslog "No such file" verir. Operatör cron'un çalışmadığını sanır. systemctl status cron active'tir; journalctl -u cron CMD satırlarını listeler. Çözüm: journal kullanmak veya rsyslog kurup cron.* kuralını açmak.

Sık Hatalar ve Çözümleri

Hata / belirtiNedenÇözüm
No such file or directory (syslog)rsyslog yok / journal-onlyjournalctl -u cron
Log dosyası oluşmuyorDizin yok veya yazma izni yoktouch + chown crontab kullanıcısına
/bin/sh: 1: cannot create ...: Permission deniedYönlendirme hedefi yazılamıyorLog yolunu home veya 775 dizin yapın
CMD yok, özel log da boşGörev tetiklenmemiş veya komut başlatma kaydı kapalıServis, sözdizimi, log yapılandırması; bkz. çalışmıyor rehberi
E-posta yokMTA yok veya çıktı /dev/nullMTA kurun veya dosya logu kullanın
Disk %100Rotasyonsuz büyüyen loglogrotate; eski *.gz temizliği

E-posta Bildirimi ve Log Rotasyonu

MAILTO=ops@ornek.com
MAILFROM=cron@sunucu.ornek.com
0 3 * * * /home/deploy/scripts/gorev.sh

# Yalnızca başarısızlıktan sonra bildirim
0 3 * * * /home/deploy/scripts/gorev.sh >> /var/log/app-cron/gorev.log 2>&1 || echo "gorev hata exit $?" | mail -s "Cron hata" ops@ornek.com

/etc/logrotate.d/app-cron örneği:

/var/log/app-cron/*.log {
    weekly
    rotate 4
    compress
    delaycompress
    missingok
    notifempty
    copytruncate
}

copytruncate, cron'un açık tuttuğu dosya tanımlayıcısını kırmadan dosyayı döndürmek için kullanışlıdır. Alternatif olarak script her çalışmada dosyayı yeniden açıyorsa create 0640 deploy deploy ile yeni dosya oluşturmak da yeterlidir. Rotasyonu kuru çalıştırarak test edin: sudo logrotate -d /etc/logrotate.d/app-cron. Gerçek döndürme için -f kullanmadan önce yedek alın; yanlış glob tüm /var/log'u etkileyebilir. find ile yaşa göre silme ve disk eşiği senaryoları için cron log temizleme rehberine bakın.

Log satırı "çalıştı" dese bile iş hiç tetiklenmezse sessiz kalır; kaçırılan koşuları yakalamak için ayrı bir cron heartbeat izleme katmanı ekleyin — log teşhisi ile dead-man's switch birbirinin yerine geçmez.

cronjob.com.tr ile HTTP İzleme Alternatifi

İşiniz bir HTTPS uç noktasıysa sunucu crontab logları yerine dışarıdan istek ve yanıt kaydı kullanabilirsiniz. Uç noktayı token header ile koruyun; panelde URL, metot, header ve zamanlamayı girin.

<?php
declare(strict_types=1);
$beklenen = getenv('CRON_SECRET') ?: '';
if ($beklenen === '' || !hash_equals($beklenen, $_SERVER['HTTP_X_CRON_TOKEN'] ?? '')) {
    http_response_code(403);
    exit('forbidden');
}
// iş...
header('Content-Type: text/plain');
echo "ok\n";

cronjob.com.tr ücretsizdir; kayıtta kredi kartı istenmez. En kısa aralık 60 saniyedir; hazır aralık veya 5 alanlı cron ifadesi ve iş bazında saat dilimi (varsayılan Europe/Istanbul) seçilir. Başarı: HTTP 200–399. Timeout aralığa göre (1 dk → 55 sn, 5 dk+ veya cron ifadeli → 290 sn). Her çalışmada durum kodu, süre, hata ve yanıt gövdesinin ilk ~64 KB'ı 7 gün tutulur. Ardışık hata eşiği (varsayılan 3) aşılınca e-posta; düzelince kesinti süresiyle "düzeldi" bildirimi gelir. User-Agent: CronJobComTr/1.0 (+https://cronjob.com.tr). Localhost / özel ağ hedeflerine istek atılmaz.

Sıkça Sorulan Sorular (SSS)

Cron job logları hangi dosyada tutulur?

Debian/Ubuntu'da çoğu kurulumda /var/log/syslog içinde CRON satırları vardır; rsyslog yoksa journalctl -u cron kullanın. CentOS/RHEL/Rocky'de /var/log/cron ve journalctl -u crond geçerlidir.

Cron job çıktısını özel bir log dosyasına nasıl yönlendiririm?

Crontab satırının sonuna >> /var/log/gorev.log 2>&1 ekleyin. Böylece stdout ve stderr aynı dosyaya eklenir. Örnek: 0 3 * * * /scripts/gorev.sh >> /var/log/gorev.log 2>&1

Sistem logunda CMD görüyorum ama iş başarısız; neden?

Cron logları yalnızca komutun başlatıldığını yazar; exit kodu ve script çıktısı burada yoktur. Başarısızlığı görmek için kendi log dosyanıza yönlendirme yapın veya script içinde tarih damgalı log yazın.

MAILTO ile e-posta gelmiyor; ne kontrol etmeliyim?

Sunucuda MTA (ör. postfix, nullmailer) kurulu ve çalışıyor olmalıdır. MAILTO= adresini crontab başına yazın; çıktıyı /dev/null'a yönlendirdiyseniz e-posta da oluşmaz. Yalnızca hatada bildirim için || mail kalıbı kullanın.

Log dosyam şişiyor; nasıl yönetirim?

/etc/logrotate.d/ altına haftalık rotate, compress ve missingok kuralları ekleyin. Alternatif olarak görev çıktısını sınırlı tutun veya yalnızca hata satırlarını yazın; disk dolunca cron görevleri de yazamaz.

Hemen Ücretsiz Cron Job Oluşturun

cronjob.com.tr ile URL işlerinizin her çalışmasını panelde görün: durum kodu, süre ve yanıt özeti 7 gün saklanır. Ücretsiz; kart gerekmez.

Ücretsiz Başla →

İlgili Rehberler