Linux sunucuda yedekleme, kuyruk işleme, sertifika yenileme veya rapor üretme gibi işleri elle çalıştırmak ölçeklenmez. Bu işleri belirli dakika, saat veya gün aralıklarında otomatikleştiren araç cron daemon'ıdır; her satır bir cron job tanımıdır. Bu rehber Ubuntu/Debian, CentOS/RHEL/Rocky ve Arch ailesinde kurulumdan loglamaya, PATH tuzaklarından çakışma önlemeye kadar pratik bir kurulum yolu verir.
Dağıtıma özel incelikler için Ubuntu cron job ve CentOS cron job sayfalarına bakabilirsiniz; macOS'ta launchd ve cron farkları için Mac cron job rehberi ayrıdır. Burada ortak Linux davranışına, gerçek hata mesajlarına ve sunucu crontab'ı yerine HTTP ile dışarıdan tetikleme seçeneğine odaklanıyoruz. Zaman alanlarının anlamı için crontab sözdizimi rehberi yardımcı olur; sık kullanılan ifadeleri tek sayfada görmek isterseniz crontab cheatsheet tablolarına bakın.
Resmi referans olarak crontab(5) ve crontab(1) man sayfalarını kullanabilirsiniz. Aşağıdaki adımlar bu davranışa dayanır.
Ön Hazırlık: Cron Kurulumu ve Servis Kontrolü
Çoğu sunucu kalıbında cron yüklüdür; minimal bulut imajlarında veya konteynerlerde paket ve servisi doğrulamak gerekir.
- Servis durumunu kontrol edin:
systemctl status cron # Debian/Ubuntu systemctl status crond # CentOS/RHEL/Rocky/Fedora systemctl status cronie # Arch (cronie paketi) - Paket yoksa kurun:
# Debian/Ubuntu sudo apt update && sudo apt install cron # CentOS/RHEL/Rocky sudo yum install cronie # veya dnf kullanan sürümlerde: sudo dnf install cronie # Fedora sudo dnf install cronie # Arch Linux sudo pacman -S cronie - Servisi başlatın ve açılışa ekleyin (Debian/Ubuntu örneği):
sudo systemctl enable --now cron systemctl is-active cron
Çıktıda active görmelisiniz. CentOS ailesinde birim adı genelde crond olur; komutları buna göre değiştirin.
Adım Adım: İlk Cron Job
- Düzenleyiciyi açın:
crontab -e. İlk kullanımda boş tablo uyarısı normaldir; kaydettiğinizde dosya oluşur. - Ortam değişkenlerini tanımlayın (önerilir):
SHELL=/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin MAILTO=""MAILTO=""çıktı postasını kapatır. Bildirim istiyorsanız geçerli bir adres yazın. - Görev satırını ekleyin:
# Her gün 03:00'te yedek; çıktı ve hatalar loga 0 3 * * * /home/kullanici/scripts/yedek.sh >> /var/log/yedek.log 2>&1 - Kaydedin ve doğrulayın:
crontab -lile satırın göründüğünü kontrol edin. Cron servisini yeniden başlatmanıza gerek yoktur; yeni crontab hemen okunur.
dakika saat gün ay haftanın_günü komut şeklindedir. Sistem dosyası /etc/crontab ve /etc/cron.d/* satırlarında komuttan önce bir kullanıcı adı alanı daha vardır.Cron Job için Script Yazma ve Test
Güvenilir bir betik: açık shebang, set -e, mutlak yollar, log fonksiyonu ve eski dosya temizliği içerir.
#!/bin/bash
# Script: yedek.sh | Cron: 0 3 * * *
set -euo pipefail
TARIH=$(date +%Y%m%d-%H%M)
YEDEK_DIZIN="/home/kullanici/yedekler"
LOG="/var/log/yedek.log"
log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG"; }
log "Yedekleme başladı"
mkdir -p "$YEDEK_DIZIN"
if /usr/bin/mysqldump -u root production | /bin/gzip > "$YEDEK_DIZIN/db-$TARIH.sql.gz"; then
log "Veritabanı yedeği başarılı: db-$TARIH.sql.gz"
else
log "HATA: Veritabanı yedeği başarısız"
exit 1
fi
find "$YEDEK_DIZIN" -name "*.sql.gz" -mtime +30 -delete
log "Yedekleme tamamlandı"
chmod +x /home/kullanici/scripts/yedek.sh
bash /home/kullanici/scripts/yedek.sh
# Cron'a yakın minimal ortamla test
env -i SHELL=/bin/bash PATH=/usr/bin:/bin HOME="$HOME" /bin/bash /home/kullanici/scripts/yedek.sh
Gerçek Senaryolar
Senaryo 1: Gece veritabanı yedeği
Her gece 03:15'te dump alıp sıkıştırır; çıktıyı loga yazar. Yoğun trafikte gündüz yedeklemek I/O'yu yükseltir; gece penceresi daha güvenlidir. mysqldump/pg_dump parametreleri, ~/.my.cnf ve rotasyon için cron ile veritabanı yedekleme adımlarını izleyin.
15 3 * * * /usr/bin/flock -n /tmp/db-yedek.lock /home/kullanici/scripts/yedek.sh >> /var/log/yedek.log 2>&1
Senaryo 2: Her 5 dakikada kuyruk işçisi
E-posta veya fatura kuyruğunu boşaltan PHP CLI işi. Önceki çalışma bitmeden yenisi başlamasın diye flock kullanılır. Rails tarafında rake veya Solid Queue recurring görevleri için Rails cron job rehberindeki zamanlama kalıpları uygulanır.
*/5 * * * * /usr/bin/flock -n /tmp/kuyruk.lock /usr/bin/php /var/www/site/artisan queue:work --stop-when-empty >> /var/log/kuyruk.log 2>&1
Crontab Dosya Yapıları ve run-parts
Kullanıcı crontab: crontab -e / crontab -l / dikkatli kullanın: crontab -r tüm tabloyu siler.
Sistem crontab (/etc/crontab):
# dakika saat gün ay hgünü kullanıcı komut
0 3 * * * root /usr/local/bin/sistem-yedek.sh
*/5 * * * * www-data /usr/bin/php /var/www/site/cron.php
Periyodik dizinler: /etc/cron.hourly/, daily, weekly, monthly. Bunlara çalıştırılabilir script koyarsınız; Debian/Ubuntu varsayılan run-parts kuralları noktalı dosya adlarını atlar (yedek.sh çalışmaz, yedek çalışır).
Paketlerin eklediği parçalı tanımlar için /etc/cron.d/ kullanılır; satır formatı sistem crontab ile aynıdır (kullanıcı alanı zorunlu).
Loglama ve İzleme
# Debian/Ubuntu (rsyslog varsa)
sudo grep CRON /var/log/syslog
sudo journalctl -u cron --since "1 hour ago"
# CentOS/RHEL/Rocky
sudo tail -f /var/log/cron
sudo journalctl -u crond --since "1 hour ago"
Başarılı tetiklemelerde genelde CRON[pid]: (user) CMD (komut) benzeri satırlar görünür. Betik hata verirse çoğu zaman syslog yerine kendi log dosyanızda veya MTA üzerinden görünür. Şişen uygulama loglarını disk dolmadan budamak için cron log temizleme ve logrotate kurallarını aynı bakıma ekleyin.
# /etc/logrotate.d/cron-gorevler
/var/log/yedek.log {
weekly
rotate 4
compress
missingok
notifempty
}
Ortam Değişkenleri ve PATH
Cron, interaktif oturumunuzdaki PATH'i miras almaz. crontab(5) uyarınca varsayılan SHELL çoğu sistemde /bin/sh, HOME ve LOGNAME passwd'den gelir. Teşhis için:
* * * * * /usr/bin/env > /tmp/cron-env.txt
Bir dakika sonra /tmp/cron-env.txt içinde gerçek PATH'i görün. Çözüm: crontab'da PATH, komutta tam yol veya betikte bilinçli ortam yükleme.
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
0 3 * * * /home/kullanici/scripts/yedek.sh
0 3 * * * /usr/bin/python3 /home/kullanici/scripts/rapor.py
İleri Teknikler: flock, timeout, gecikme
*/5 * * * * /usr/bin/flock -n /tmp/gorev.lock /scripts/uzun-gorev.sh
0 3 * * * /usr/bin/timeout 3600 /scripts/uzun-islem.sh
0 3 * * * /bin/bash -c '/bin/sleep $((RANDOM \% 600)) && /scripts/yedek.sh'
flock -n kilit alınamazsa hemen çıkar; çakışan kopyaları engeller. timeout takılı süreçleri keser. Rastgele sleep, aynı dakikada başlayan çok sayıda sunucunun API'yi boğmasını azaltır.
Dağıtım Farklılıkları
| Özellik | Debian/Ubuntu | CentOS/RHEL/Rocky | Arch Linux |
|---|---|---|---|
| Paket | cron | cronie | cronie |
| Servis birimi | cron | crond | cronie |
| Tipik log | syslog / journalctl -u cron | /var/log/cron / journalctl -u crond | journalctl |
| Kullanıcı spool | /var/spool/cron/crontabs/ | /var/spool/cron/ | /var/spool/cron/ |
Sık Hatalar ve Çözümleri
1. /bin/sh: 1: php: not found
Neden: Cron PATH'inde PHP yok veya farklı sürüm yolu kullanılıyor.
Çözüm: which php / command -v php ile tam yolu bulun; crontab'da /usr/bin/php gibi yazın.
2. Permission denied
Neden: Script çalıştırılabilir değil veya log/dizin yazılamıyor.
Çözüm: chmod +x script.sh; log dizininin crontab sahibine yazılabilir olduğundan emin olun.
3. /etc/cron.daily/yedek.sh çalışmıyor
Neden: Debian/Ubuntu varsayılan run-parts kuralları, dosya adında nokta varsa betiği sessizce atlar.
Çözüm: sudo mv /etc/cron.daily/yedek.sh /etc/cron.daily/yedek && sudo chmod +x /etc/cron.daily/yedek.
4. (CRON) info (No MTA installed, discarding output)
Neden: Komut stdout/stderr üretti; sistemde yerel posta ileticisi yok.
Çözüm: MAILTO="" veya komut sonuna >> /var/log/gorev.log 2>&1 ekleyin.
5. You (user) are not allowed to use this program (crontab)
Neden: /etc/cron.allow / /etc/cron.deny erişimi kısıtlıyor. Bu dosyalar yalnızca crontab komutunu kısıtlar; mevcut tablodaki işler silinene kadar çalışmaya devam edebilir.
Çözüm: Yönetici sizi cron.allow listesine eklemeli veya cron.deny'den çıkarmalıdır.
Güvenlik Önlemleri
echo "deploy" | sudo tee /etc/cron.allow
chmod 700 /home/kullanici/scripts/*.sh
# Sırlar: chmod 600 olan ayrı dosyadan
set -a; source /home/kullanici/.cron-env; set +a
Crontab'a düz metin şifre yazmayın. Hassas işleri mümkünse uygulama içi sır deposu veya root dışı düşük yetkili kullanıcı ile çalıştırın. Let's Encrypt sertifikasını yenileyen betikleri de aynı güvenlik disiplininde tutun; cron ile SSL yenileme rehberi certbot zamanlamasını ve yeniden yükleme adımlarını verir.
cronjob.com.tr ile HTTP Tabanlı Alternatif
İşiniz bir URL ile tetiklenebiliyorsa (ör. API cleanup, webhook benzeri uç nokta) sunucuda crontab kurmadan cronjob.com.tr üzerinden zamanlayabilirsiniz. Ücretsizdir; kayıtta kredi kartı istenmez. En kısa aralık 60 saniyedir; hazır aralık veya 5 alanlı cron ifadesi kullanılır, saat dilimi iş bazında seçilir (varsayılan Europe/Istanbul). CI/CD tarafında periyodik işler için sunucu cron yerine GitLab pipeline schedule de kullanılabilir; yerel shell betikleriyle webhook tetikleme arasındaki seçim için cron alternatifleri karşılaştırmasına bakın.
<?php
// public/cron/gece-bakim.php
declare(strict_types=1);
$token = $_SERVER['HTTP_X_CRON_TOKEN'] ?? '';
$beklenen = getenv('CRON_TOKEN') ?: '';
if ($beklenen === '' || !hash_equals($beklenen, $token)) {
http_response_code(401);
echo 'unauthorized';
exit;
}
// bakım işi...
http_response_code(200);
echo 'ok';
Panelde URL'yi, metodu (GET/POST vb.), X-Cron-Token başlığını ve zamanlamayı girin. Başarı ölçütü HTTP 200–399 ve bağlantı hatası olmamasıdır. Yanıt bekleme aralığa göre hesaplanır (1 dk → 55 sn, 2 dk → 115 sn, 5 dk ve üzeri veya cron ifadeli işler → 290 sn). Ardışık hata eşiği (varsayılan 3) aşılınca e-posta gelir; loglar 7 gün tutulur. User-Agent: CronJobComTr/1.0 (+https://cronjob.com.tr). Yerel/özel ağ adreslerine istek gönderilmez; uç noktanızın internetten erişilebilir HTTPS olması gerekir.
Sıkça Sorulan Sorular (SSS)
Cron job oluşturdum ama çalışmıyor, ne yapmalıyım?
Sırasıyla kontrol edin: cron servisi active (running) mi, script chmod +x ile çalıştırılabilir mi, komutlarda tam yol var mı, crontab -l çıktısı beklediğiniz satırı gösteriyor mu ve cron loglarında CMD veya hata satırı düşüyor mu.
Root olmadan cron job oluşturabilir miyim?
Evet. crontab -e her kullanıcının kendi tablosunu düzenlemesine izin verir. Yönetici /etc/cron.allow dosyası oluşturmuşsa yalnızca listedeki kullanıcılar crontab kullanabilir; cron.allow yoksa cron.deny listedekileri engeller.
Terminalde çalışan scriptim cron'da neden çalışmıyor?
Cron minimal bir ortamla çalışır; SHELL genelde /bin/sh, PATH ise /usr/bin:/bin civarındadır. Interaktif shell'deki alias, nvm veya .bashrc yüklenmez. Tam yol kullanın veya crontab başına PATH tanımlayın.
/etc/cron.daily içine koyduğum script neden çalışmıyor?
Bu dizinler run-parts ile taranır. Debian/Ubuntu varsayılan kurallarında dosya adında nokta (örneğin yedek.sh) varsa betik yok sayılır. Adı yedek veya sistem-yedek gibi noktasız yapın, chmod +x verin ve sahipliğin doğru olduğundan emin olun.
Sonuç
Linux'ta güvenilir cron: doğru paket/servis, mutlak yollar, bilinçli PATH, log yönlendirme ve çakışma kilidinden geçer. Dağıtım farklarını tablodan kontrol edin; HTTP ile tetiklenebilen işlerde cronjob.com.tr sunucu crontab bakımını azaltır.
Hemen Ücretsiz Cron Job Oluşturun
Linux sunucunuzdaki bakımı HTTPS uç noktasına bağlayıp cronjob.com.tr panelinden dakikalık aralıklarla tetikleyin; başarısız çağrılarda e-posta alın, son 7 günlük yanıt loglarını inceleyin. Ücretsizdir; kayıtta kredi kartı istenmez.
Ücretsiz Başla →