Daha önce bir Linux sunucusu yönettiyseniz, arka uç geliştirmede çalıştıysanız veya otomatik bulut işlevlerini ayarladıysanız, muhtemelen şuna benzeyen bir dizeyle karşılaşmışsınızdır: 0 2 * * *. Deneyimsiz olanlar için klavyede kalmış bir yazım hatası gibi görünüyor. Sistem yöneticileri için bu, modern altyapı otomasyonunun kalbidir: bir Cron İfadesi.
Cron interneti çalıştıran görünmez motordur. Veritabanınızın sabah 3:00'te yedeklenmesini sağlar, her Pazartesi sabahı aldığınız e-postaları tetikler ve geçici sunucu dosyalarını sistemi çökertmeden temizler. Ancak gücüne rağmen söz dizimini insanlar için ayrıştırmanın oldukça zor olduğu biliniyor. Bu ayrıntılı incelemede yıldız işaretlerini açığa çıkaracağız ve size deneyimli bir DevOps mühendisi gibi cron programlarını nasıl okuyup yazacağınızı öğreteceğiz.
Cron ve Crontab nedir?
Cron, Unix benzeri bilgisayar işletim sistemlerinde bulunan zamana dayalı bir iş zamanlayıcıdır. "Cron" adı Yunanca zaman kelimesinden gelir: chronos. Yazılım ortamlarını kuran ve bakımını yapan kullanıcılar, işleri (komutlar veya kabuk komut dosyaları) sabit zamanlarda, tarihlerde veya aralıklarla periyodik olarak çalışacak şekilde planlamak için cron'u kullanır.
Crontab (Cron Tablosu), bu programların depolandığı yapılandırma dosyasıdır. Crontab'ınızı terminal aracılığıyla düzenlediğinizde, sunucuya tam olarak neyin ne zaman yürütüleceğini söyleyen talimatların bir listesini yazarsınız.
5 Yıldız İşaretinin Yapısını Çözmek
Standart bir cron ifadesi boşluklarla ayrılmış 5 alandan oluşur. Her alan belirli bir zaman birimini temsil eder ve her zaman soldan sağa doğru tam olarak şu sırayla okunur:
* * * * * command_to_execute
- - - - -
| | | | |
| | | | +----- Day of the Week (0 - 6) (Sunday=0 or 7)
| | | +------- Month (1 - 12)
| | +--------- Day of the Month (1 - 31)
| +----------- Hour (0 - 23)
+------------- Minute (0 - 59)
Yıldız işareti (*), "bu alan için mümkün olan her değer" anlamına gelir. Yani, * * * * * ifadesi kelimenin tam anlamıyla şu anlama gelir: "Her dakikayı, her saati, her günü, her ayı, haftanın her gününü çalıştır."
Sözdizimi Değiştiriciler: Adımlar, Aralıklar ve Listeler
Cron'un gücü değiştiricilerinden gelir. Yalnızca belirli sayılarla veya "her şeyle" sınırlı değilsiniz.
1. Adım Değiştirici (/)
Bir betiğin 15 dakikada bir çalışmasını istiyorsanız bir adım kullanırsınız. */15 * * * * "15'e bölünebilen her dakika" anlamına gelir. Saati 0, 15, 30 ve 45'te çalışacak.
2. Aralık Değiştirici (-)
Bir komut dosyasının yalnızca iş saatlerinde çalışmasını istiyorsanız bir aralık kullanırsınız. 0 9-17 * * * "sıfırıncı dakikada, sabah 9'dan akşam 5'e kadar her saat çalıştır" anlamına gelir.
3. Liste Değiştirici (,)
Bir şeyin belirli, sıralı olmayan günlerde çalışmasını istiyorsanız bir liste kullanın. 0 0 1,15 * * "ayın 1'i ve 15'i gece yarısında çalıştır" anlamına gelir.
Cron İfadelerini Tahmin Etmeyi Durdurun
Her ay yerine her dakika bir yedekleme komut dosyası çalıştırma riskine girmeyin. Tek bir yazım hatası üretim sunucusunun çökmesine neden olabilir. Cron dizelerini güvenli bir şekilde oluşturmak ve doğrulamak için etkileşimli görsel oluşturucumuzu kullanın.
Cron Job Generator'ı açınEn Tehlikeli Cron Hatası
Geliştiricilerin yaptığı en yaygın ve en büyük hata "Dakika" alanını karıştırmaktır. Saatte bir kez saat 02:00'de bir veritabanı temizleme komut dosyası çalıştırmak istediğiniz bir senaryoya bakalım.
Hata: * 2 * * *
Yukarıdakileri yazarsanız sunucuya "Her dakika, günün 2. saatinde" scriptini çalıştırmasını söylemiş olursunuz. Ağır veritabanı temizleme komut dosyanız art arda 60 kez tetiklenecek, muhtemelen CPU'nuz aşırı yüklenecek, veritabanı tabloları kilitlenecek ve büyük bir kesintiye neden olacaktır.
Doğru Yol: 0 2 * * *
Bu açıkça sunucuya yalnızca "2. saatin sıfır dakikasında" çalışmasını söyler. Saat 2:00'de tam olarak bir kez yürütülecek.
Sıkça Sorulan Sorular (SSS)
Cron Saat Dilimlerini hesaba katıyor mu?
Varsayılan olarak cron, ifadeleri üzerinde çalıştığı sunucunun yerel sistem saatine göre değerlendirir. Sunucunuz Londra'daki bir AWS bölgesinde barındırılıyorsa UTC/GMT'de çalışır. Kullanıcılarınız New York veya Tokyo'daysa saat dilimi farklılıklarını hesaba katmalısınız.
Bir cron işini her saniyede çalışacak şekilde planlayabilir miyim?
Hayır. Standart Unix cron'u bir dakikalık çözünürlükle sınırlıdır. Dakika altı planlamaya ihtiyacınız varsa (örneğin, her 10 saniyede bir), ayrı bir arka plan programı aracı kullanmanız veya her dakika çalışan ancak uyku komutlarıyla dahili olarak döngüye giren bir komut dosyası yazmanız gerekir.
@daily veya @hourly gibi dizeler ne anlama geliyor?
Birçok modern cron uygulaması, planlamayı kolaylaştırmak için standart olmayan, önceden tanımlanmış makroları destekler. @daily, 0 0 * * * (her gün gece yarısı) ile tamamen aynıdır. @saatlik, 0 * * * * ile aynıdır. Yararlı olmalarına rağmen tüm eski sistemlerde evrensel olarak desteklenmezler.