Linux'ta Cron Job Oluşturma Baştan Sona Rehber

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

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.

  1. Servis durumunu kontrol edin:
    systemctl status cron        # Debian/Ubuntu
    systemctl status crond       # CentOS/RHEL/Rocky/Fedora
    systemctl status cronie      # Arch (cronie paketi)
  2. 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
  3. 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

  1. Düzenleyiciyi açın: crontab -e. İlk kullanımda boş tablo uyarısı normaldir; kaydettiğinizde dosya oluşur.
  2. 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.
  3. 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
  4. Kaydedin ve doğrulayın: crontab -l ile satırın göründüğünü kontrol edin. Cron servisini yeniden başlatmanıza gerek yoktur; yeni crontab hemen okunur.
Not: Kullanıcı crontab'ında alan sırası 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ı

ÖzellikDebian/UbuntuCentOS/RHEL/RockyArch Linux
Paketcroncroniecronie
Servis birimicroncrondcronie
Tipik logsyslog / journalctl -u cron/var/log/cron / journalctl -u crondjournalctl
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 →

İlgili Rehberler