Cron çalışmıyor: Sunucuda kontrol listesi (Linux)
Cron çalışmıyorsa hatayı tek tek bulmak için saat/zaman dilimi, loglar, PATH, izinler, kullanıcı cronu ve servis ayarlarını kontrol et.
Cron (zamanlanmış görev) çalışmıyorsa sorun çoğu zaman “cron bozuldu” değildir. Sorun; görev tanımındaki küçük bir ayrıntı, zaman dilimi (timezone), PATH/env değişkeni, eksik izinler ya da cron loglarının sessiz kalması gibi nedenlerden çıkar. Bu rehberde, Cron’un neden çalışmadığını sırayla doğrulayacak net bir kontrol akışı öğreneceksiniz. Ayrıca NetKıyas’ta karşılaştırılan VDS/VPS senaryolarında sık görülen uygulama bağımlılıklarını (node/php script yolu, yorumlayıcı, servis yeniden başlatma) kontrol etmeyi de öğreneceksiniz.
1) Önce hangi cron türü çalışıyor: user cron mu, sistem cron mu?
Linux’ta cron mantığı dağıtıma göre değişir ama genelde iki ana katman vardır:
- User crontab: Her kullanıcı için ayrı zamanlanmış işler (örn. crontab -e ile düzenlenenler)
- System cron: Paketle gelen cron daemon’u ve sistem servisleri (çoğunlukla cron, bazı sistemlerde crond)
Hızlı teşhis: cron daemon çalışıyor mu?
Aşağıdaki komutlar cron servisinin gerçekten çalıştığını gösterir:
- systemctl status cron
- veya bazı dağıtımlarda: systemctl status crond
Servis çalışmıyorsa cron hiç tetiklenmez. Bu durumda yapılacaklar:
- systemctl enable --now cron (veya crond)
- Ardından loglara bakın (aşağıda).
Kullanıcı crontab’ını doğru kullanıcıyla mı düzenlediniz?
Cron girdisini eklediğiniz kullanıcı ile çalıştırmanız gereken komutun çıktısı aynı kullanıcıya ait olmalıdır. Örneğin root adına eklenmiş ama beklenen görev başka kullanıcıdan bekleniyorsa çalışsa bile “siz görmüyor olabilirsiniz”.
Kontrol:
- Mevcut crontab’ı görmek için: crontab -l
- Başka bir kullanıcı için: sudo crontab -l -u <kullanici>
2) Loglarda “tetiklendi mi, tetiklenmedi mi?” sorusunu netleştirin
Cron’un çalışmamasında en kritik adım, loglardan ne kadar bilgi alabildiğinizi doğrulamaktır. Dağıtımın log konfigürasyonuna göre log dosyası değişir.
En yaygın loglar
- Debian/Ubuntu benzeri:
/var/log/syslogiçinde cron kayıtları - RHEL/CentOS/Alma/Rocky:
/var/log/cronveya/var/log/croniclebenzeri
Kontrol örnekleri:
- grep CRON /var/log/syslog | tail -n 200
- grep CRON /var/log/cron | tail -n 200
Hedef: Cron daemon’un “job started” gibi bir kayıt üretip üretmediğini anlamak.
Journalctl ile tek noktadan kontrol
Systemd kullanan sistemlerde şu komut da işe yarar:
- journalctl -u cron -S today --no-pager
- veya journalctl -u crond -S today --no-pager
Burada görmeniz gerekenler: - Job tetikleniyor mu? - Hata var mı? (ör. “command not found”, “permission denied”, “/bin/sh: …”)
3) Zaman dilimi (timezone) ve “takvim tutmuyor” senaryosu
Cron ayarı doğru görünse bile saat farklı olabilir. Özellikle sunucu VPS/VDS’lerde çoğu zaman panel/OS timezone farkı görülür.
Sunucu timezone’unu kontrol edin
timedatectl
Önemli alanlar: - Time zone - System clock set
Cron satırında beklediğiniz dakika/saat mi yazıyor?
Cron formatı şu şekildedir:
* * * * * komut
- Sırasıyla dakika, saat, ayın günü, ay, haftanın günü.
Net kontrol için örnek:
- */5 * * * * /usr/bin/php /var/www/app/script.php : her 5 dakikada bir.
Eğer beklediğiniz saat 03:00 iken sunucu 06:00 gösteriyorsa bu komut 3 saat kayar.
4) PATH ve ortam değişkenleri: “Çalışıyor ama cron’da çalışmıyor”ın ana sebebi
Cron, etkileşimli shell’inize göre çok daha kısıtlı bir ortamla çalışır. Sen terminalde çalıştırdığında PATH’in içinde olan komut cron’da bulunamayabilir.
Belirti
- Loglarda
/bin/sh: 1: komut: not foundbenzeri hatalar
Çözüm: Komutları tam yol ile çağırın
Örnek:
- Yanlış: python script.py
- Doğru: /usr/bin/python3 /var/www/app/script.py
PATH’i cron içinde tanımlayın (net ve kontrollü)
Crontab başına şu satırları eklemek çok net sonuç verir:
- PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Alternatif yaklaşım: sadece komutları tam yol ile çağırmak (daha deterministik).
5) Yorumlayıcı (PHP/Node/Python) ve shebang uyuşmazlığı
Özellikle scriptlerin uzaktan çalıştırılmasında cron şunları yapar:
- Dosyayı shell ile değil, belirtilen komutla çalıştırır.
- Shebang (#!/usr/bin/env node gibi) doğru değilse tetiklenmez.
PHP örneği
- Yanlış:
php /var/www/app/artisan schedule:run - Doğru:
/usr/bin/php /var/www/app/artisan schedule:run
Node örneği
- Yanlış:
node server.js - Doğru:
/usr/bin/node /var/www/app/server.js
Dosya izinleri
Script dosyası çalıştırma iznine sahip değilse hata verir.
Kontrol:
- ls -l /path/to/script
- Gerekirse: chmod +x /path/to/script
6) Kullanıcı izinleri, dosya sahipliği ve çalışma dizini (working directory)
Cron komutu genellikle crontab satırında verilen komut ve mevcut çalışma dizini üzerinden gider. Görevin dosya yolu göreli (relative) ise cron farklı dizinde başlayıp dosya bulamaz.
Net çözüm: Mutlak dizin kullanın
- Göreli yol yerine:
/var/www/app/storage/logs/...
Working directory’yi sabitleyin
Cron içine cd ekleyin:
- * * * * * cd /var/www/app && /usr/bin/php artisan command:run >> /var/log/app/cron.log 2>&1
Bu yaklaşım hataların kaydını da netleştirir.
Çalıştıran kullanıcı dosyaları okuyabiliyor mu?
Kontrol:
- sudo -u <kullanici> ls -l /var/www/app
- Log dosyasına yazabiliyor mu?
7) Çıktıyı yakalayın: sessiz başarısızlıklar
Cron satırı doğru olsa bile hata oluşur ve siz görmezsiniz. Bu yüzden çıktıyı mutlaka dosyaya yönlendirin.
Hata ayıklama için standart redirect
Örnek:
- 0 * * * * /usr/bin/python3 /opt/job/run.py >> /var/log/job/cron.log 2>&1
Bu sayede loglarda şunları görürsünüz: - Stack trace - permission denied - bağlantı hataları
Mail ile bildirim (varsa) yerine log tercih edin
Cron mail gönderimi bazı sistemlerde düzgün ayarlanmaz. En hızlı teşhis için dosya redirect’i kullanın.
8) “Komut çalıştı ama beklenen sonuç oluşmadı” senaryosu
Cron tetikleniyor, log var ama iş “işlem yapmıyor” olabilir. Bu durumda genelde şunlar vardır: - Script doğru ama dış bağımlılık yok: veritabanı erişimi, API anahtarı, çevresel değişkenler (env) - Zamanlanmış görev “lock” mekanizması yüzünden atlıyor - Sistem kaynakları yetersiz (CPU/RAM) ve görev zaman aşımına uğruyor
Ortam değişkenlerini kontrol edin (env/secret)
Cron’da terminalde export ettiğiniz değişkenler yoktur. Bu yüzden uygulama config’i doğrudan env dosyasına bağlıysa cron’da eksik kalır. Net çözüm seçenekleri: - Her gereken değişkeni crontab içine eklemek - Uygulama tarafında env okuyan mekanizmayı doğru kurmak
DB bağlantısı ve erişim
Örnek net test: - Cron kullanıcısı ile DB’ye aynı kullanıcı/kimlik ile bağlanıp bağlanmadığını doğrulayın.
9) Cron ile etkileşen servisler: Docker, systemd timer, container restart
Bazı sistemlerde “cron” yerine “systemd timer” veya “Docker container içi cron” hedeflenir. Hangi katmanda çalıştığınızı bilmek gerekir.
Eğer Docker kullanıyorsanız
- Cron komutu host’ta mı çalışıyor yoksa container içinde mi?
- Container durduğunda cron tetiklenir ama hedef süreç yoktur.
Bu senaryoda önce container loglarını kontrol edin.
systemd timer kullanıyorsanız cron değil timer devreye alınmış olabilir
Bazı kurulumlarda hem cron hem timer var; beklediğiniz job timer tarafından farklı bir şekilde tetiklenir.
Kontrol:
- systemctl list-timers --all | grep -i <görev>
10) VDS/VPS panel ayarları ve güvenlik duvarı etkisi (gözden kaçanlar)
Cron’un tetiklenmesi bazen doğru olur; fakat görev dışarı çağrı yaptığında (API, webhook, SMTP) firewall veya ağ kısıtları yüzünden başarısız olur.
Ağ erişimi kontrolü
- Scriptin kullandığı domain/IP’lere bağlantı var mı?
- Sunucuda DNS çözümleme çalışıyor mu?
Net test:
- curl -I https://hedef-domain.com (uygulamanın kullandığı endpoint ile)
- dig hedef-domain.com veya nslookup
Yetki ve güvenlik (sudoers/SSH key)
Cron job’u SSH ile işlem yapıyorsa:
- SSH anahtarlarının doğru kullanıcıya ait olduğunu doğrulayın
- known_hosts dosyasının cron kullanıcıda mevcut olup olmadığını kontrol edin
Cron için pratik “tek seferde teşhis” kontrol listesi
Aşağıdaki listeyi sırayla uygulayın; çoğu problem burada çözülür:
- systemctl status cron / crond (servis çalışıyor mu?)
- grep CRON /var/log/syslog veya /var/log/cron (tetikleme kaydı var mı?)
- timedatectl (timezone doğru mu?)
- Crontab’ı doğru kullanıcı mı düzenlendi? (sudo crontab -l -u)
- Komutlar tam yol ile mi? (/usr/bin/php, /usr/bin/python3)
- Çalışma dizini doğru mu? (cd /var/www/app && ...)
- Script izinleri doğru mu? (chmod +x)
- Çıktı ve hata logu var mı? (>> /var/log/... 2>&1)
- Dış bağımlılıklar (DB/API/env) cron kullanıcıda çalışıyor mu?
- Güvenlik duvarı / ağ erişimi endpoint’lere gidiyor mu?
Sonuç: Aksiyon planı
Cron’un çalışmaması durumunda en hızlı yol “tek adımda kesinleştirme” yapmaktır: Önce cron daemon çalışıyor mu, sonra logda tetikleniyor mu, ardından PATH/timezone/izin ve çıktı yönlendirme sorunlarını düzeltin. Eğer job log dosyasına yazmıyorsa ve loglarda hiç tetikleme kaydı yoksa servis ve crontab kullanıcı hatası en yüksek olasılıktır. Bu adımları uyguladığınızda, sorunun nerede kilitlendiğini net biçimde görür ve aynı hatayı tekrarlamadan çözümü kalıcı hale getirirsiniz.
Hosting karşılaştırması yapmaya hazır mısın?
100+ firmanın fiyatlarını tek tıkla karşılaştır, en uygun paketi bul.
Hosting Karşılaştır →İlgili Yazılar
Hosting fiyatlarında KDV ve gizli maliyetler: Net kontrol rehberi
Hosting faturasında KDV ve gizli kalemler nasıl çıkar? Fiyat teklifi ile gerçekte ödenecek tutarı karşılaştırmanı sağlayan net kontrol listesi.
TTFB (Time to First Byte) Nedir? Nasıl Düşürülür?
TTFB (Time to First Byte) gecikmesini ölçün, kök nedeni bulun ve sunucu + uygulama + CDN ayarlarıyla ilk yanıt süresini düşürün.
Anycast DNS: Türkiye’de en iyi performans için net uygulama rehberi
Anycast DNS’in mantığını, Türkiye’den erişimde gecikme ve doğruluk farklarını ve doğru yapılandırma kontrol listesini öğrenin.
Cron çalışmıyor: Sunucuda kontrol edilecek 15 kritik nokta
Cron job tetiklenmiyor mu? Zaman, servis, PATH, izinler, loglar ve environment değişkenlerini tek tek kontrol ederek kök nedeni bulun.
