Cron ifadeleri: beş alan ve örnekler
Bir cron ifadesi, bir işin ne zaman çalışacağını söyleyen boşlukla ayrılmış beş alandır: dakika, saat, ayın günü, ay, haftanın günü. Soldan sağa okunduğunda 30 2 * * 1, herhangi bir ayın herhangi bir gününde, o gün Pazartesi ise, saat 2'nin 30. dakikasında anlamına gelir.
Beş alan
Her standart Unix cron satırı aynı beş alanla başlar, ardından çalıştırılacak komut gelir.
* * * * * command to run
| | | | |
| | | | +-- day of week (0-7, 0 and 7 both mean Sunday, or SUN-SAT)
| | | +---- month (1-12, or JAN-DEC)
| | +------ day of month (1-31)
| +-------- hour (0-23)
+---------- minute (0-59)
Bir alan dört şeyden birini tutar: her değer anlamına gelen bir yıldız, tek bir sayı, bir liste, veya bir aralık. Saatler AM veya PM olmadan 24 saatlik bir saat kullanır, bu yüzden akşam 6 18'dir. Pazar hem 0 hem 7'dir, çünkü farklı sistemler tarihsel olarak anlaşamamıştır, ve cron ikisini de kabul eder.
Bazı zamanlayıcılar alan ekler. Birçok Java çerçevesinin kullandığı Quartz, başa bir saniye alanı koyar ve sona isteğe bağlı bir yıl ekler, bu yüzden bir Quartz referansından kopyalanan altı veya yedi alanlı bir ifade bir Linux crontab'ında çalışmaz. Herhangi bir yerden bir ifade kopyalamadan önce hangi çeşit için yazdığınızı kontrol edin.
Özel karakterler
*alandaki her değerle eşleşir.* * * * *her dakika çalışır.,değerleri listeler.0 8,13,20 * * *08:00, 13:00 ve 20:00'de çalışır.-bir aralık verir.0 9-17 * * *09:00'dan 17:00'a kadar her saat başı çalışır./bir aralık boyunca adımlarla ilerler.*/15 * * * *dakika 0, 15, 30 ve 45'te çalışır. Bunu bir aralıkla birleştirebilirsiniz:0 9-17/2 * * *9, 11, 13, 15 ve 17'de çalışır.- İsimler.
MON'danSUN'a veJAN'danDEC'e kadar olanlar son iki alanda çalışır ve sayılardan daha iyi okunur. Bir adımın içinde kullanılamazlar.
Öğreticilerde sürekli görünen ama standart cron'da bulunmayan dört karakter daha vardır. Son gün için L, en yakın hafta içi günü için W, ayın n'inci hafta içi günü için #, ve bir yıldız yerine ?, Quartz uzantılarıdır. 0 0 L * * gibi bir ifade bir Linux crontab'ı tarafından reddedilir. Orada ayın son gününde bir şey çalıştırmak için, onu her gün çalıştırın ve kararı komuta bırakın:
0 0 * * * [ "$(date -d tomorrow +\%d)" = "01" ] && /usr/local/bin/month-end.sh
O satırdaki ters eğik çizgilere dikkat edin. Bir crontab'da yüzde işaretinin özel bir anlamı vardır, ki bu da aşağıdaki beşinci hatadır.
Cron ayrıca beş alanın tamamı yerine altı kısaltma dizesini de kabul eder: @yearly (@annually olarak da yazılır), @monthly, @weekly, @daily (@midnight de), @hourly, ve bir saatte değil cron başladığında bir kez çalışan @reboot. @reboot her yerde desteklenmez.
Yaygın zamanlamalar
| Ne zaman çalışmasını istiyorsunuz | İfade |
|---|---|
| Her dakika | * * * * * |
| Her 5 dakikada bir | */5 * * * * |
| Her 30 dakikada bir | 0,30 * * * * |
| Her saat başı | 0 * * * * |
| Her 2 saatte bir | 0 */2 * * * |
| Her gün gece yarısı | 0 0 * * * |
| Her gün 02:30'da | 30 2 * * * |
| Günde iki kez, 08:00 ve 20:00 | 0 8,20 * * * |
| Hafta içi 09:00'da | 0 9 * * MON-FRI |
| Hafta içi mesai saatlerinde her saat | 0 9-17 * * MON-FRI |
| Her Pazartesi 07:00'de | 0 7 * * MON |
| Her Pazar 03:15'te | 15 3 * * SUN |
| Ayın ilk günü 06:00'da | 0 6 1 * * |
| Üç ayda bir, Ocak, Nisan, Temmuz, Ekim'in ilk günü | 0 0 1 1,4,7,10 * |
İşi yanlış zamana koyan hatalar
- Her iki gün alanını da doldurmak. Herkesi yakalayan hata budur. Ayın günü ve haftanın günü ikisi de yıldız dışında bir şeye ayarlandığında, cron işi ikisi de değil herhangi biri eşleştiğinde çalıştırır.
0 0 13 * FRI, her 13'ünde ve her Cuma çalışır, Cuma 13'ünde değil. - Aralığı tam bölmeyen bir adım.
*/7 * * * *, dakika 0, 7, 14, 21, 28, 35, 42, 49 ve 56'da tetiklenir, sonra 0'da yeniden başlar. Saat sınırındaki boşluk yedi değil dört dakikadır. Aynı tuzak, dakika alanındaki*/40için ve 60'ın çarpanı olmayan her adım için geçerlidir. - Adımı yanlış alana koymak.
*/2 * * * *her iki dakikada birdir.0 */2 * * *her iki saatte birdir. Baştaki0'ı düşürmek, saatlik bir işi 30 kat daha sık çalışan bir işe çevirir. - Ortamı varsaymak. Cron işe genellikle
PATH=/usr/bin:/binveSHELL=/bin/sh'den fazlası olmayan minimal bir ortam verir. Kabuğunuzda çalışan bir betik,/usr/local/biniçindeki bir şeyi çağırdığı için cron'da başarısız olur. Komut için ve içinde mutlak yollar kullanın. - Kaçış karakteri kullanılmamış bir yüzde işareti. Bir crontab'da
%bir yeni satıra dönüştürülür ve ilkinden sonraki her şey komuta standart girdi olarak beslenir. Bir crontab satırı içindekidate +%Y-%m-%d,date +\%Y-\%m-\%dolarak yazılmalıdır. - Çıktıyı görmezden gelmek. İşin yazdırdığı her şey crontab sahibine postalanır, ve posta yapılandırılmamış bir makinede atılır. Onu okuyacağınız bir yere gönderin:
0 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1 - Çalıştırmaların üst üste binmesine izin vermek. Cron, öncekinin bitip bitmediğine bakmaksızın bir sonraki çalıştırmayı programa göre başlatır. Uzun işleri bir kilide sarın:
*/5 * * * * flock -n /tmp/sync.lock /usr/local/bin/sync.sh - Saat değişikliklerini unutmak. Cron, makinenin yerel saatini kullanır. Saatlerin kaydığı günlerde, 02:00 civarındaki saat ya hiç var olmaz ya da iki kez yaşanır, bu yüzden içinde zamanlanmış bir iş, cron uygulamasına bağlı olarak atlanabilir veya iki kez çalışabilir. Sunucuları UTC'ye ayarlayın, veya o pencerenin dışında zamanlayın.
crontab -ryazmak. Bu, hiçbir onay istemeden tüm crontab'ı siler, vecrontab -e'den yalnızca bir tuş uzaktadır. Crontab'ı sürüm kontrolünde tutun ve onu bir dosyadan kurun.
Dışarıdan kontrol edin
Ayrıştırılan bir ifade, çalışmış bir işle aynı şey değildir. İkisini de doğrulayın: önce makinede, sonra onun dışından.
Makinede, neyin kurulu olduğunu, saatin ne dediğini ve cron'un işi başlatıp başlatmadığını doğrulayın:
crontab -l
timedatectl
grep CRON /var/log/syslog | tail -20
journalctl -u cron -u crond --since "2 hours ago"
Günlük satırı, cron'un komutu başlattığını kanıtlar. Komutun başarılı olup olmadığı hakkında hiçbir şey söylemez, ki yukarıdaki hatalarda bir günlük dosyasına yönlendirmenin önemli olmasının nedeni de budur.
Sonra sonucu bir kullanıcının yapacağı gibi, sunucunun dışından kontrol edin. Zamanlanmış işlerin çoğu, gözlemlenebilir bir şeyi değiştirmek için vardır: bugünün tarihini taşıması gereken bir besleme, yeniden yazılmış olması gereken bir site haritası, görünmüş olması gereken bir dışa aktarma. Onu isteyin ve başlıkları okuyun:
curl -sI https://example.com/exports/daily.json
curl -s https://example.com/health/last-run
Last-Modified başlığı, dosyanın taze olup olmadığını size kabuk erişimi olmadan söyler. Aynı isteği HTTP kontrolüyle birkaç konumdan çalıştırmak, hiç çalışmamış bir işi, bir bölgede bir kenarda önbelleğe alınmış ve yalnızca orada bayat olan bir sayfadan ayırır. Bu ayrım, sunucunun kendisindeki tek bir curl'den görünmezdir.
Zamanlanmış bir işin ne zaman çalışmayı bıraktığını bilmek
Çalışmayı bırakan bir cron işi fark edilecek hiçbir şey üretmez. Hiçbir hata sayfası ve başarısız istek yoktur, bu yüzden bir şey yokluğu izlemedikçe hiçbir şey uyarı vermez. İzlediğiniz şey işin kendisi değil etkisidir: yeniden yazdığı bir durum dosyası, yayınladığı bir zaman damgası, son başarılı çalıştırmasını raporlayan bir uç nokta. O uç noktaya karşı zamanlanmış bir kontrol, sessiz bir başarısızlığı bir bildirime dönüştürür, ve HostTracker bunları 13 monitör türü boyunca e-posta, SMS, sesli arama, Slack, Telegram ve daha fazlasıyla gönderir. Birini kurmanın mekaniği HTTP kontrolü rehberindedir, diğer sorun giderme rehberleri düzeltme kümesindedir, ve kontrol türlerinin tam listesi özellikler sayfasındadır.