Ana içeriğe geç

Rehberler / Düzeltin: insanların gerçekten karşılaştığı hatalar için rehberler

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'dan SUN'a ve JAN'dan DEC'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 bir0,30 * * * *
Her saat başı0 * * * *
Her 2 saatte bir0 */2 * * *
Her gün gece yarısı0 0 * * *
Her gün 02:30'da30 2 * * *
Günde iki kez, 08:00 ve 20:000 8,20 * * *
Hafta içi 09:00'da0 9 * * MON-FRI
Hafta içi mesai saatlerinde her saat0 9-17 * * MON-FRI
Her Pazartesi 07:00'de0 7 * * MON
Her Pazar 03:15'te15 3 * * SUN
Ayın ilk günü 06:00'da0 6 1 * *
Üç ayda bir, Ocak, Nisan, Temmuz, Ekim'in ilk günü0 0 1 1,4,7,10 *

İşi yanlış zamana koyan hatalar

  1. 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.
  2. 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 */40 için ve 60'ın çarpanı olmayan her adım için geçerlidir.
  3. Adımı yanlış alana koymak. */2 * * * * her iki dakikada birdir. 0 */2 * * * her iki saatte birdir. Baştaki 0'ı düşürmek, saatlik bir işi 30 kat daha sık çalışan bir işe çevirir.
  4. Ortamı varsaymak. Cron işe genellikle PATH=/usr/bin:/bin ve SHELL=/bin/sh'den fazlası olmayan minimal bir ortam verir. Kabuğunuzda çalışan bir betik, /usr/local/bin içindeki bir şeyi çağırdığı için cron'da başarısız olur. Komut için ve içinde mutlak yollar kullanın.
  5. 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çindeki date +%Y-%m-%d, date +\%Y-\%m-\%d olarak yazılmalıdır.
  6. Çı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
  7. Ç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
  8. 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.
  9. crontab -r yazmak. Bu, hiçbir onay istemeden tüm crontab'ı siler, ve crontab -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.

Şimdi kontrol edin

Ücretsiz kontrolü kendi sitenizde çalıştırın - hesap gerekmez.

Features

Bunu sürekli izleyin

Bir sorun çıktığı anda haberdar olun: HostTracker 300’den fazla konumdan kontrol eder ve size e-posta, SMS, Slack, Telegram ve daha fazlasıyla bildirim gönderir.

HostTracker özellikleri

Bu bölümde daha fazlası: Düzeltin: insanların gerçekten karşılaştığı hatalar için rehberler