Cron Scheduler: Linux Sunucularında Görevleri Otomatikleştirmeye Yönelik Tam Kılavuz
Tekrarlayan görevleri otomatikleştirmek, verimli sunucu yönetiminin temel taşlarından biridir. İster küçük bir kişisel web sitesi yönetiyor ister VPS Hosting planında bir üretim ortamı yönetiyor olun, Linux cron zamanlayıcısı, zaman kazandıran, insan hatasını azaltan ve sistemlerinizi saat gibi çalıştıran — hatta uyurken bile — vazgeçilmez bir araçtır.
Bu kapsamlı rehber, cron hakkında bilmeniz gereken her şeyi kapsar: temel daemon ve söz dizimini anlamaktan, gerçek dünya kullanım durumlarına, günlüğe kaydetme stratejilerine ve zamanlanmış işlerinizi sürdürülebilir ve güvenli tutmak için en iyi uygulamalara kadar.
Cron Nedir ve Neden Önemlidir?
Cron, Unix benzeri işletim sistemlerine, tüm büyük Linux dağıtımlarına yerleşik olan zaman tabanlı bir iş zamanlayıcısıdır. Arka planda bir daemon işlemi (crond) olarak sessizce çalışır ve belirli bir zamanda veya aralıkta yürütülmesi gereken görevler için crontab olarak bilinen yapılandırma dosyalarını sürekli olarak kontrol eder.
“Cron” adı, zaman anlamına gelen Yunanca “chronos” (χρόνος) kelimesinden gelir — ve bu tam olarak cron’un size verdiği kontroldür.
Cron Kullanmanın Temel Faydaları
- Otomasyon: Tekrarlayan görevleri manuel olarak tetikleme ihtiyacını ortadan kaldırın.
- Güvenilirlik: İşler, oturum açmış olup olmadığınız fark etmeksizin zamanında çalışır.
- Esneklik: Görevleri dakika, saat, gün, hafta, ay veya herhangi bir kombinasyonda zamanlayın.
- Kaynak verimliliği: Yoğun görevleri (yedekleme veya dizinleme gibi) yoğun olmayan saatlerde çalıştırın.
- Ölçeklenebilirlik: Tek bir sunucu veya tüm Dedicated Servers filosu arasında düzinelerce otomatik iş akışını yönetin.
Cron Daemon Nasıl Çalışır?
Cron daemon (crond) önyükleme sırasında otomatik olarak başlar ve arka planda sürekli çalışır. Her dakika, tüm crontab dosyalarını okur ve zamanlanmış herhangi bir işin geçerli saate uyup uymadığını kontrol eder. Uyuyorsa, daemon ilişkili komutu veya betiği yürütür.
Crontab Dosyası Türleri
| Tür | Konum | Amaç |
|---|---|---|
| Kullanıcı crontab | crontab -e aracılığıyla yönetilir | Kullanıcı başına zamanlanmış görevler |
| Sistem crontab | /etc/crontab | Kullanıcı alanı ile sistem genelinde görevler |
| Drop-in dizini | /etc/cron.d/ | Uygulamaya özgü cron dosyaları |
| Önceden tanımlanmış zamanlamalar | /etc/cron.daily/, /etc/cron.weekly/ vb. | Standart aralıklarda çalışan betikler |
Bu hiyerarşiyi anlamak önemlidir, özellikle paylaşılan ortamları veya cPanel ile VPS yönetirken, sistem ve kullanıcı düzeyinde cron işleri bir arada bulunabilir.
Crontab’a Erişme ve Düzenleme
Adım 1: Terminal’inizi Açın
SSH aracılığıyla Linux sunucunuza bağlanın veya yerel bir terminal oturumu açın.
Adım 2: Crontab Dosyasını Düzenleyin
Geçerli kullanıcı için cron işleri oluşturmak veya değiştirmek için şunu çalıştırın:
crontab -eBu, crontab dosyasını sisteminizin varsayılan metin editöründe açar (genellikle nano veya vi). Bu ilk kez ise, bir editör seçmeniz istenebilir.
Belirli bir kullanıcının crontab’ını düzenlemek için (root ayrıcalıkları gerekir):
crontab -e -u usernameSistem genelinde crontab‘ı doğrudan düzenlemek için:
sudo nano /etc/crontabCron İşi Söz Dizimini Anlama
Her cron işi, yürütülecek komutun ardından gelen katı bir beş alan zaman belirtimi biçimini izler:
* * * * * command_to_execute
│ │ │ │ │
│ │ │ │ └── Day of Week (0–7, Sunday = 0 or 7)
│ │ │ └──── Month (1–12 or Jan, Feb, ..., Dec)
│ │ └────── Day of Month (1–31)
│ └──────── Hour (0–23)
└────────── Minute (0–59)Alan-Alan Analizi
| Alan | İzin Verilen Değerler | Açıklama |
|---|---|---|
| Dakika | 0–59 | İşin çalıştığı dakika |
| Saat | 0–23 | İşin çalıştığı saat (24 saatlik saat) |
| Ayın Günü | 1–31 | Ayın belirli günü |
| Ay | 1–12 veya Oca–Ara | Belirli ay |
| Haftanın Günü | 0–7 (0 ve 7 = Pazar) | Haftanın belirli günü |
Özel Karakterler ve Zaman İfadeleri
Cron, zamanlamayı oldukça esnek hale getiren birkaç özel karakteri destekler:
Yıldız * — Joker Karakter (Tüm Değerler)
Bu alan için her olası değerle eşleşir.
# Run every minute of every hour, every day
* * * * * /usr/bin/my-script.shVirgül , — Değer Listesi
Birden fazla ayrı değer belirtin.
# Run at 1, 15, and 45 minutes past every hour
1,15,45 * * * * /usr/bin/my-script.shTire - — Değer Aralığı
Sürekli bir aralık tanımlayın.
# Run every minute from 9:00 AM to 5:59 PM, Monday to Friday
* 9-17 * * 1-5 /usr/bin/my-script.shEğik Çizgi / — Adım Değerleri (Artışlar)
Bir aralık içinde düzenli aralıklarla çalıştırın.
# Run every 5 minutes
*/5 * * * * /usr/bin/my-script.sh
# Run every 2 hours
0 */2 * * * /usr/bin/my-script.shÖzel Dizeler — Kısayol Zamanlamalar
Birçok modern cron uygulaması uygun kısayol dizelerini destekler:
| Dize | Eşdeğeri | Açıklama |
|---|---|---|
@reboot | — | Başlangıçta bir kez çalıştır |
@yearly | 0 0 1 1 * | Yılda bir kez çalıştır |
@monthly | 0 0 1 * * | Ayda bir kez çalıştır |
@weekly | 0 0 * * 0 | Haftada bir kez çalıştır |
@daily | 0 0 * * * | Gece yarısında günde bir kez çalıştır |
@hourly | 0 * * * * | Saatte bir kez çalıştır |
Pratik Cron İşi Örnekleri
Veritabanı Yedeklemesi — Her Gece Saat 2:00’de
0 2 * * * /usr/bin/mysqldump -u root -pYourPassword mydb > /backups/mydb_$(date +%F).sqlUygulama Önbelleğini Temizle — Her 6 Saatte Bir
0 */6 * * * /var/www/html/artisan cache:clear >> /var/log/cache-clear.log 2>&1Sistem Güncelleme Betiğini Çalıştır — Her Pazar Saat 3:30’da
30 3 * * 0 /usr/local/bin/system-update.shHaftalık Rapor Gönder — Her Pazartesi Saat 8:00’de
0 8 * * 1 /usr/local/bin/generate-report.sh | mail -s "Weekly Report" admin@yourdomain.comSSL Sertifikası Süresini Kontrol Et — Günlük Öğlen
0 12 * * * /usr/local/bin/check-ssl.sh >> /var/log/ssl-check.log 2>&1> Pro İpucu: Birden fazla etki alanı için SSL Sertifikaları yönetiyorsanız, cron ile yenileme kontrollerini otomatikleştirmek, beklenmedik sertifika süresi dolmalarını önleyen en iyi bir uygulamadır.
Crontab Editörünü Kaydetme ve Kapatma
Cron işlerinizi ekledikten veya değiştirdikten sonra, editörü kaydedin ve kapatın:
Nano’da (Çoğu Sistemde Varsayılan)
CTRL + Xtuşuna basın- Kaydetmeyi onaylamak için
Ytuşuna basın - Dosyaya yazmak için
Entertuşuna basın
Vi / Vim’de
- Ekleme modundan çıkmak için
Esctuşuna basın :wqyazın veEntertuşuna basın
Kaydettikten sonra, cron güncellenen crontab’ı otomatik olarak yükler — hizmet yeniden başlatması gerekmez.
Mevcut Cron İşlerini Görüntüleme ve Yönetme
Geçerli Kullanıcı İçin Tüm Cron İşlerini Listele
crontab -lBelirli Bir Kullanıcı İçin Cron İşlerini Listele (Root Gerekli)
crontab -l -u usernameGeçerli Kullanıcı İçin Tüm Cron İşlerini Kaldır
crontab -r> Uyarı: crontab -r tüm cron işlerini onay olmaksızın hemen siler. Önce crontab’ınızı crontab -l > crontab-backup.txt ile yedekleyin.
Sistem Genelinde Cron İşlerini Görüntüle
cat /etc/crontab
ls /etc/cron.d/
ls /etc/cron.daily/Cron İşi Çıktısını Günlüğe Kaydetme
Varsayılan olarak, cron terminale çıktı göstermez. Çıktı genellikle yerel sistem kullanıcısına gönderilir veya sessizce atılır. Uygun günlüğe kaydetme, hata ayıklama ve denetim için gereklidir.
Çıktıyı Bir Günlük Dosyasına Yönlendir
Hem standart çıktıyı (stdout) hem de standart hatayı (stderr) bir günlük dosyasına ekleyin:
0 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1>>çıktıyı ekler (her seferinde üzerine yazmak için>kullanın)2>&1stderr’i stdout ile aynı hedefe yönlendirir
Tüm Çıktıyı Bastır (Sessiz Mod)
Herhangi bir çıktıya ihtiyacınız yoksa:
0 2 * * * /usr/local/bin/backup.sh > /dev/null 2>&1Çıktıyı E-posta Yoluyla Gönder
İş çıktısını e-posta ile almak için crontab’ınızın üst kısmında MAILTO değişkenini ayarlayın:
MAILTO="admin@yourdomain.com"
0 2 * * * /usr/local/bin/backup.shE-posta bildirimlerini tamamen devre dışı bırakmak için MAILTO="" ayarlayın.
Özel Bir Günlük Yönetim Stratejisi Kullanın
Üretim sunucuları için, cron günlüklerini merkezi bir günlüğe kaydetme sistemi (örneğin rsyslog, journald veya bir günlük toplama platformu) ile entegre etmeyi düşünün. Cron ile ilgili sistem günlüğü girişlerini şu şekilde görüntüleyebilirsiniz:
grep CRON /var/log/syslog
# or on systemd-based systems:
journalctl -u cronCrontab’da Ortam Değişkenleri
Cron minimal bir ortamda çalışır — .bashrc veya .bash_profile dosyalarını kaynak olarak almaz. Bu, betiklerin terminalde çalışması ancak cron işleri olarak başarısız olması durumunda yaygın bir karışıklık kaynağıdır.
Ortam değişkenlerini doğrudan crontab’ınızda tanımlayabilirsiniz:
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
MAILTO="admin@yourdomain.com"
HOME=/root
0 2 * * * /usr/local/bin/backup.shEn iyi uygulama: Cron işlerinde komutlar ve betikler için her zaman mutlak yollar kullanın, PATH ile ilgili hataları önlemek için.
Cron İşleri İçin Güvenlik Hususları
Cron’u Kimler Kullanabilir Kontrol Edin
/etc/cron.allow— Yalnızca burada listelenen kullanıcılar cron’u kullanabilir./etc/cron.deny— Burada listelenen kullanıcılar cron’u kullanmaktan engellenir.
cron.allow varsa, yalnızca listelenen kullanıcılara izin verilir. Her iki dosya da yoksa, yalnızca root cron’u kullanabilir (davranış dağıtıma göre değişir).
Cron İşlerinde Hassas Verileri Koruyun
Parolaları veya API anahtarlarını doğrudan crontab girişlerine gömmeyin. Bunun yerine:
- Kimlik bilgilerini kısıtlı izinlere sahip güvenli bir yapılandırma dosyasında (
chmod 600) depolayın. - Korumalı bir dosyadan yüklenen ortam değişkenlerini kullanın.
- Uygun olduğunda gizli yönetim araçlarından yararlanın.
Cron İşlerini Düzenli Olarak Denetleyin
Yetkisiz veya unutul
