İçindekiler
Cron, Linux'ta zamanlanmış görevlerin klasik aracıdır. Yedekler, rapor e-postaları, önbellek temizliği, WordPress görevleri... Hepsi genellikle tek bir satırla tanımlanır. Ama o satırdaki beş alan ilk bakışta şifre gibi görünür.
Beş alan
┌───────── dakika (0–59)
│ ┌─────── saat (0–23)
│ │ ┌───── ayın günü (1–31)
│ │ │ ┌─── ay (1–12)
│ │ │ │ ┌─ haftanın günü (0–7; 0 ve 7 = Pazar)
│ │ │ │ │
* * * * * komut
Özel karakterler:
*→ her değer,→ liste:1,15(1'inde ve 15'inde)-→ aralık:1-5(Pazartesi–Cuma)/→ adım:*/10(her 10 birimde bir)
Örneklerle
*/5 * * * * Her 5 dakikada bir
0 * * * * Her saat başı
30 2 * * * Her gece 02:30'da
0 9 * * 1-5 Hafta içi her gün 09:00'da
0 0 1 * * Her ayın 1'inde gece yarısı
15 4 * * 0 Her Pazar 04:15'te
0 */6 * * * Her 6 saatte bir (00, 06, 12, 18)
0 8,12,18 * * * Günde üç kez: 08:00, 12:00, 18:00
Kısaltmalar da kullanılabilir: @reboot (açılışta bir kez), @daily, @hourly, @weekly, @monthly.
Bir tuzak: Gün alanları
Ayın günü ve haftanın günü alanlarının ikisi de doluysa, cron bunları "ve" değil "veya" olarak yorumlar:
0 0 13 * 5 → Her ayın 13'ünde VE her Cuma (yalnızca 13 Cuma değil!)
Bu davranışı bilmeyen pek çok kişi sürpriz yaşamıştır.
Crontab'ı düzenlemek
crontab -e # kendi kullanıcınızın görevleri
crontab -l # listele
crontab -u www -e # başka bir kullanıcının görevleri (root olarak)
Sistem genelindeki görevler /etc/crontab dosyasında ve /etc/cron.d/ klasöründe durur. Bu dosyalarda dakika alanlarından sonra bir de kullanıcı adı alanı vardır. Kişisel crontab'ta bu alan yoktur. İkisini karıştırmak, görevin hiç çalışmamasına yol açar.
"Terminalde çalışıyor, cron'da çalışmıyor"
Cron hakkında en çok sorulan soru budur. Sebebi neredeyse her zaman aynıdır: Cron sizin oturum ortamınızı bilmez.
1. PATH çok kısıtlıdır. Cron genellikle yalnızca /usr/bin:/bin ile çalışır. /usr/local/bin/wp ya da bir sanal ortamdaki python bulunamaz. Çözüm: Komutlarda tam yol kullanın ya da crontab'ın başına PATH tanımlayın.
PATH=/usr/local/bin:/usr/bin:/bin
2. Çalışma dizini farklıdır. Cron görevi kullanıcının ev dizininde başlar. Betiğiniz göreli yollar kullanıyorsa önce cd yapın:
0 3 * * * cd /opt/rapor && ./olustur.sh
3. % işareti özeldir. Crontab'ta % yeni satır anlamına gelir. date +%F gibi komutlarda kaçırmanız gerekir:
0 2 * * * tar -czf /yedek/site-$(date +\%F).tar.gz /var/www
4. Ortam değişkenleri yoktur. .bashrc ya da .bash_profile dosyalarında tanımladığınız değişkenler cron'da yoktur. Gerekenleri betiğin içinde tanımlayın ya da bir dosyadan okuyun.
5. Betiğin çalıştırma izni yoktur. chmod +x betik.sh, ya da betiği bash betik.sh şeklinde çağırın.
Teşhis: Çıktıyı yakalayın
Cron, görevin çıktısını yerel e-postayla göndermeye çalışır; çoğu sunucuda bu e-postayı kimse okumaz. Çıktıyı bir dosyaya yönlendirin:
*/5 * * * * /opt/bot/kontrol.sh >> /var/log/kontrol.log 2>&1
2>&1 kısmı hata mesajlarının da aynı dosyaya yazılmasını sağlar. Sorunu gördüğünüz anda büyük ihtimalle command not found ya da Permission denied gibi açık bir mesajla karşılaşırsınız.
Cron'un görevi gerçekten tetikleyip tetiklemediğini de sistem günlüğünden görebilirsiniz:
grep CRON /var/log/cron # RHEL / AlmaLinux
grep CRON /var/log/syslog # Debian / Ubuntu
journalctl -u crond --since today
Aynı görevin üst üste binmesi
Her 5 dakikada çalışan bir görev bir gün 7 dakika sürerse, bir sonraki çalışma öncekinin üstüne biner. Veri bozulmasının sinsi sebeplerinden biridir. flock ile önleyin:
*/5 * * * * flock -n /tmp/senkron.lock /opt/senkron.sh
-n parametresi, kilit doluysa yeni çalışmanın beklemeden çıkmasını sağlar.
Cron, kırk yılı aşkın süredir aynı sözdizimiyle çalışıyor. Birkaç kuralını öğrendiğinizde, sunucudaki en güvenilir yardımcınız olur.
Yorumlar
Henüz yorum yok. İlk yorumu siz yazın.