Bir gece sunucunuz kapandı, sabah açıldı ve o gece çalışması gereken kritik yedekleme scripti hiç çalışmadı. Cron job’larınız var ama sistem kapalıyken zamanlama geçip gitti, görev uçup gitti. İşte tam bu noktada anacron devreye giriyor ve “kaçırılan” görevleri telafi ediyor.
Anacron Nedir ve Neden Lazım?
Klasik cron, görevleri belirli zaman dilimlerinde çalıştırır. Sistem o anda açık değilse? Görev çalışmaz, bir daha da çalışmaz. Laptop’lar, aralıklı açılan sunucular veya bakım penceresi olan sistemler için bu ciddi bir sorun.
Anacron ise işi farklı ele alır. “Bu görev son X günde çalıştı mı?” sorusunu sorar. Eğer çalışmadıysa, sistem açılışında veya anacron tetiklendiğinde görevi çalıştırır. Günlük, haftalık ya da aylık periyotlarda tanımladığınız görevler, sistem ne zaman açılırsa açılsın eninde sonunda çalışır.
Anacron’un temel farkı şu: cron dakika bazında çalışır, anacron gün bazında çalışır. Dakikadan daha kısa aralıklı görevler için anacron uygun değil. Ama “her gün bir kez mutlaka çalışsın” dediğiniz şeyler için biçilmiş kaftan.
Anacron Nasıl Çalışır?
Anacron her çalıştığında /var/spool/anacron/ dizinindeki zaman damgası dosyalarını kontrol eder. Her görev için ayrı bir dosya vardır. Bu dosyalarda o görevin en son ne zaman çalıştığı yazar.
Hesaplama şöyle işler:
- Mevcut tarih ile zaman damgası arasındaki fark, tanımlı periyottan büyük veya eşitse görev çalışır
- Görev çalıştıktan sonra zaman damgası güncellenir
- Sistem her boot’ta veya düzenli aralıklarla anacron’u tetikler
# Zaman damgası dosyalarına bakmak için
ls -la /var/spool/anacron/
cat /var/spool/anacron/cron.daily
Çıktı şuna benzer:
20241215
Bu tarihten bu yana bir günden fazla geçmişse, cron.daily altındaki tüm scriptler çalıştırılır.
Anacron Kurulumu
Çoğu modern Linux dağıtımında anacron zaten kurulu gelir. Kontrol etmek için:
# Kurulu mu kontrol et
which anacron
anacron --version
# Ubuntu/Debian'da kurulum
sudo apt-get install anacron
# RHEL/CentOS/Rocky Linux'ta kurulum
sudo dnf install cronie-anacron
# Servis durumunu kontrol et
systemctl status crond
# veya
systemctl status cron
Debian/Ubuntu sistemlerde anacron, cron paketinin içinde gelir ve /etc/cron.d/, /etc/cron.daily/, /etc/cron.weekly/, /etc/cron.monthly/ dizinleriyle otomatik entegre olur.
/etc/anacrontab Dosyasını Anlamak
Anacron’un kalbi /etc/anacrontab dosyasıdır. Yapısını inceleyelim:
cat /etc/anacrontab
Tipik bir çıktı:
# /etc/anacrontab: configuration file for anacron
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
RANDOM_DELAY=45
START_HOURS_RANGE=3-22
#period in days delay in minutes job-identifier command
1 5 cron.daily nice run-parts /etc/cron.daily
7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly
Her satırı parçalara ayıralım:
Periyot (period in days): Görevin kaç günde bir çalışacağı. 1 her gün, 7 her hafta anlamına gelir. @monthly özel bir değer ve her ay demek.
Gecikme (delay in minutes): Sistem açıldıktan veya anacron tetiklendikten kaç dakika sonra bu görevin başlayacağı. Bu önemli bir parametre, birazdan açıklayacağım.
Görev tanımlayıcı (job-identifier): /var/spool/anacron/ altındaki zaman damgası dosyasının adı. Benzersiz olmalı.
Komut (command): Çalıştırılacak komut veya script.
Ortam değişkenleri:
- SHELL: Kullanılacak shell
- PATH: Komut arama yolu
- MAILTO: Çıktı nereye gönderilsin
- RANDOM_DELAY: Her göreve ek olarak eklenecek maksimum rastgele gecikme (dakika)
- START_HOURS_RANGE: Anacron’un görev başlatabileceği saat aralığı (3-22 demek sabah 3 ile akşam 10 arası)
Gecikme Parametresi Neden Önemli?
Düşünün, sunucunuz sabah 7’de boot oluyor ve aynı anda 10 tane ağır görev birden başlıyor. Sistem felç olur. İşte delay parametresi tam bu yüzden var.
1 5 cron.daily nice run-parts /etc/cron.daily
7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly
Bu konfigürasyonda:
- Günlük görevler 5 dakika sonra başlar
- Haftalık görevler 25 dakika sonra başlar
- Aylık görevler 45 dakika sonra başlar
Üstüne bir de RANDOM_DELAY=45 var. Bu, her göreve 0-45 dakika arası rastgele bir gecikme daha ekler. Yani günlük görev aslında 5 ile 50 dakika arası bir süre sonra başlayabilir. Bu özellikle NFS veya paylaşımlı kaynaklara erişen ortamlarda çok sayıda sunucunun aynı anda yüklenmesini engeller.
Kendi Anacron Görevlerinizi Tanımlamak
Yöntem 1: /etc/cron.daily Dizinine Script Koymak
En basit yöntem. Script’inizi uygun dizine koyun ve anacron otomatik halleder:
# Günlük yedekleme scripti oluştur
sudo nano /etc/cron.daily/backup-databases
#!/bin/bash
# Veritabanı yedekleme scripti
DATE=$(date +%Y%m%d)
BACKUP_DIR="/backup/databases"
LOG_FILE="/var/log/db-backup.log"
mkdir -p "$BACKUP_DIR"
echo "[$DATE] Yedekleme başladı" >> "$LOG_FILE"
# MySQL veritabanlarını yedekle
for DB in $(mysql -u backup_user -pSifreBurada -e "SHOW DATABASES;" | grep -v "Database|information_schema|performance_schema"); do
mysqldump -u backup_user -pSifreBurada "$DB" | gzip > "$BACKUP_DIR/${DB}_${DATE}.sql.gz"
echo "[$DATE] $DB yedeklendi" >> "$LOG_FILE"
done
# 30 günden eski yedekleri sil
find "$BACKUP_DIR" -name "*.sql.gz" -mtime +30 -delete
echo "[$DATE] Yedekleme tamamlandı" >> "$LOG_FILE"
Script’i çalıştırılabilir yapmayı unutmayın:
sudo chmod +x /etc/cron.daily/backup-databases
Yöntem 2: /etc/anacrontab’a Doğrudan Eklemek
Daha fazla kontrol istiyorsanız anacrontab’ı düzenleyin:
sudo nano /etc/anacrontab
Şu satırı ekleyin:
3 10 weekly-report /opt/scripts/generate-weekly-report.sh
Bu görev 3 günde bir, sistem açıldıktan 10 dakika sonra çalışır.
Yöntem 3: Kullanıcı Düzeyinde Anacron
Root yetkisi olmayan kullanıcılar da anacron kullanabilir:
# Kullanıcı anacrontab dizini oluştur
mkdir -p ~/.anacron/spool
# Kullanıcı anacrontab dosyası oluştur
cat > ~/.anacrontab << 'EOF'
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
LOGNAME=kullanici_adi
1 2 kisisel-yedek /home/kullanici/scripts/personal-backup.sh
7 5 haftalik-rapor /home/kullanici/scripts/weekly-stats.sh
EOF
# Bunu crontab ile tetikle (sistem açık olduğunda düzenli çalışsın)
crontab -e
Crontab’a eklenecek satır:
@hourly anacron -s -t /home/kullanici/.anacrontab -S /home/kullanici/.anacron/spool
Anacron’u Manuel Çalıştırmak ve Test Etmek
# Anacron'u test modunda çalıştır (aslında çalıştırmaz, ne yapacağını söyler)
sudo anacron -T
# Tüm görevleri zorla çalıştır (zaman damgasına bakmadan)
sudo anacron -f
# Sadece belirli bir görevi çalıştır
sudo anacron -f cron.daily
# Verbose modda çalıştır
sudo anacron -d
# Arka planda çalıştırmadan, terminal çıktısıyla test et
sudo anacron -d -f cron.daily
Bir görevi test etmeden önce önce simüle edin:
# Zaman damgasını sıfırla (görevi "hiç çalışmamış" gibi göster)
sudo sh -c 'echo 19700101 > /var/spool/anacron/cron.daily'
# Şimdi anacron'u çalıştır ve ne olduğunu izle
sudo anacron -d
Gerçek Dünya Senaryosu: E-Ticaret Sunucusu
Diyelim ki bir e-ticaret platformu yönetiyorsunuz. Sunucu her gece bakım için kapatılıyor, sabah açılıyor. Şu görevlerin mutlaka çalışması gerekiyor:
# /etc/cron.daily/ecommerce-maintenance
#!/bin/bash
LOGDIR="/var/log/ecommerce"
DATE=$(date +"%Y-%m-%d %H:%M:%S")
mkdir -p "$LOGDIR"
exec >> "$LOGDIR/maintenance.log" 2>&1
echo "=== Bakım başladı: $DATE ==="
# 1. Veritabanı optimize et
echo "Veritabanı optimize ediliyor..."
mysql -u root -pRootSifre ecommerce -e "
OPTIMIZE TABLE orders;
OPTIMIZE TABLE products;
OPTIMIZE TABLE sessions;
DELETE FROM sessions WHERE last_activity < DATE_SUB(NOW(), INTERVAL 7 DAY);
"
# 2. Ürün görsel thumbnail'larını yenile
echo "Görseller kontrol ediliyor..."
find /var/www/html/uploads/products -name "*.jpg" -newer /var/www/html/uploads/.last_thumb_gen | while read img; do
convert "$img" -resize 200x200 "${img%.jpg}_thumb.jpg"
done
touch /var/www/html/uploads/.last_thumb_gen
# 3. Log dosyalarını arşivle
echo "Loglar arşivleniyor..."
find /var/log/nginx -name "*.log" -mtime +1 | while read logfile; do
gzip -9 "$logfile"
done
# 4. Stok uyarı maili gönder
LOW_STOCK=$(mysql -u root -pRootSifre ecommerce -se "SELECT COUNT(*) FROM products WHERE stock_quantity < 10 AND is_active = 1;")
if [ "$LOW_STOCK" -gt "0" ]; then
echo "Dikkat: $LOW_STOCK ürünün stoğu kritik seviyede!" | mail -s "Stok Uyarısı" [email protected]
fi
echo "=== Bakım tamamlandı: $(date +"%Y-%m-%d %H:%M:%S") ==="
Script’i yerleştirin ve yetkilendirin:
sudo cp ecommerce-maintenance /etc/cron.daily/
sudo chmod 755 /etc/cron.daily/ecommerce-maintenance
sudo chown root:root /etc/cron.daily/ecommerce-maintenance
Anacron ile Cron’u Birlikte Kullanmak
Anacron ve cron birbirinin rakibi değil, tamamlayıcısı. Şu strateji çok iyi çalışır:
- Cron: Dakika/saat bazlı, sistem açıkken kritik olan görevler (monitoring, alert gönderme)
- Anacron: Gün bazlı, mutlaka çalışması gereken ama tam zamanı önemli olmayan görevler (yedekleme, rapor, temizlik)
# Crontab örneği - sistem açıkken her saat çalışsın
0 * * * * /opt/scripts/check-disk-space.sh
# Anacrontab örneği - her gün mutlaka bir kez çalışsın
# (sistem kapalıysa açılınca çalışır)
1 15 disk-cleanup /opt/scripts/cleanup-old-files.sh
Sorun Giderme
Görev Neden Çalışmıyor?
# Anacron loglarını kontrol et
grep anacron /var/log/syslog | tail -20
grep anacron /var/log/cron | tail -20
# Systemd tabanlı sistemlerde
journalctl -u cron --since "24 hours ago" | grep -i anacron
# Script'in çalıştırma yetkisi var mı?
ls -la /etc/cron.daily/
stat /etc/cron.daily/backup-databases
# Script'te syntax hatası var mı?
bash -n /etc/cron.daily/backup-databases
Yaygın Hatalar ve Çözümleri
Script çalışmıyor ama hata da yok:
Cron/anacron ortamı interaktif shell’den farklıdır. PATH değişkeni kısıtlıdır. Script’inizde tam yolları kullanın:
# Yanlış
mysqldump -u root database > backup.sql
# Doğru
/usr/bin/mysqldump -u root database > /backup/database.sql
“anacron: can’t chdir to /root” hatası:
# HOME değişkenini script içinde tanımlayın
export HOME=/root
# veya anacrontab'a ekleyin
HOME=/root
Görev çalışıyor ama mail gelmiyor:
# MAILTO boş bırakmak mail gönderimini devre dışı bırakır
MAILTO=""
# Belirli adrese göndermek için
MAILTO="[email protected]"
# Mail servisi çalışıyor mu kontrol et
systemctl status postfix
systemctl status sendmail
Script çalışıyor ama zaman damgası güncellenmiyor:
# Zaman damgası dosyasının yazılabilir olduğundan emin ol
ls -la /var/spool/anacron/
sudo chmod 0600 /var/spool/anacron/cron.daily
Systemd Timer ile Karşılaştırma
Modern sistemlerde systemd timer da benzer işlevi görür ve “persistent” özelliğiyle kaçırılan görevleri telafi edebilir. Ama anacron’un avantajları hala geçerli:
- Kurulumu çok daha basit, sadece bir satır
/etc/cron.dailygibi standart dizinlerle doğrudan entegrasyon- Eski sistemlerde de çalışır
- Konfigürasyonu anlaması daha kolay
Systemd timer tercih ettiğiniz durumlarda da olsa, mevcut anacron altyapısını anlamak zorunda kalacaksınız çünkü büyük ihtimalle sunucunuzda zaten çalışıyor.
Anacron Güvenliği
# /etc/anacrontab sadece root tarafından yazılabilmeli
ls -la /etc/anacrontab
# Çıktı: -rw-r--r-- 1 root root ...
# Cron dizinlerindeki scriptler sadece root'a ait olmalı
# ve world-writable OLMAMALI
find /etc/cron.daily /etc/cron.weekly /etc/cron.monthly -perm /o+w
# Yukarıdaki komut çıktı verirse bu scriptler güvenlik riski
# Düzeltmek için:
sudo chmod o-w /etc/cron.daily/tehlikeli-script
Script’lerde hassas bilgiler (şifreler) varsa:
# Şifreleri ayrı dosyada tut
echo "DB_PASS=gizlisifre" > /etc/backup-secrets
chmod 600 /etc/backup-secrets
chown root:root /etc/backup-secrets
# Script içinde source et
source /etc/backup-secrets
mysqldump -u root -p"$DB_PASS" mydb > /backup/mydb.sql
Sonuç
Anacron, sysadmin araç kutusunun sessiz kahramanlarından biri. Göze çarpmaz, fazla konuşulmaz ama kritik görevlerin güvenilirliğini dramatik şekilde artırır. Özellikle şu durumlarda anacron kullanmayı ciddi ciddi düşünün:
- Sunucunuz her gece veya hafta sonu kapanıyorsa
- Yedekleme, log temizleme, rapor üretme gibi “günde bir kez yeter” türü görevleriniz varsa
- Cron görevinizin çalışıp çalışmadığını sabah sabah kontrol etmek istemiyorsanız
Kurulumu beş dakika, konfigürasyonu on satır. Ama sağladığı güvenlik ağı paha biçilemez. Bir gece sunucu çöktü, sabah ayağa kalktı ve kritik yedekleme o gün çalışmış bulundu. İşte anacron tam olarak bunu garantilemek için var.
Başlangıç için önerim: Mevcut /etc/cron.daily/ dizininizdeki scriptlere bakın, ne çalıştığını anlayın, sonra kendi özel görevlerinizi buraya veya doğrudan anacrontab‘a ekleyin. Bir hafta sonra gece kapanmalarının artık sorun olmadığını göreceksiniz.