Bloga geri dön

Cron işleri nasıl izlenir: 5 heartbeat deseni

· 7 dk okuma

Cron işleri sessizce başarısız olur. Beş heartbeat deseni - dead man's switch'ten exit kodu sarmalayıcısına - hatayı ilk siz öğrenin.

Cron işleri nasıl izlenir: 5 heartbeat deseni

Cron, işleri zamanlamaya göre çalıştırmakta mükemmel, bunu yapmadığında size haber vermekte ise berbattır. Çalışmayı durduran bir yedekleme nadiren göreceğiniz bir hata fırlatır. Sadece sessizce hiçbir şey yapmaz ve bunu haftalar sonra, yedeğe ihtiyacınız olduğunda ve orada olmadığında fark edersiniz. Bu sessiz arıza problemidir ve tam da bu yüzden önem taşıyan her zamanlanmış iş bir heartbeat kontrolüne ihtiyaç duyar.

Bir heartbeat (veya "dead man's switch") mantığı tersine çevirir. Bir şey ters gittiğinde uyarmak yerine, işiniz her şey yolundayken bir izleme endpoint'ini pingler. Beklenen ping zamanında gelmezse, monitör uyarır. Ping yok, ses yok, büyük sorun var.

Aşağıda en basitten en sağlama doğru beş desen var. Hepsi, izleme aracınızdan bir heartbeat URL'sine sahip olduğunuzu varsayar.

Desen 1: Klasik dead man's switch

Mümkün olan en basit kurulum. İşiniz tamamlandıktan sonra bir URL'yi çağırır. Monitör beklenen pencerede mesajı almazsa uyarır.

# 02:30'da günlük yedekleme, tamamlanınca ping
30 2 * * * /usr/local/bin/backup.sh && curl -fsS https://monitorunuz/ping/abc123

&& önemlidir: curl yalnızca backup.sh çıkış kodu 0 (başarı) ile bittiğinde çalışır. Yedekleme başarısız olursa hiç ping gönderilmez ve monitör bunu yakalar. -fsS bayrakları, curl'ün HTTP hatalarında sessizce başarısız olmasını sağlar ama gerçek sorunları yine de gösterir.

Zayıf yanı: yalnızca betiğin çalıştığını ve sıfırla bittiğini doğrular. Betik kendi hatalarını yutar ve yine de sıfırla biterse, yanlış bir "her şey yolunda" alırsınız.

Desen 2: Yalnızca gerçek başarıda ping

Shell'de çıkış kodu zincirlemeye güvenmek yerine başarı sinyalini açık hale getirin. Çok adımlı betiklerde bu daha nettir.

#!/bin/bash
set -euo pipefail   # herhangi bir hatada gürültülü şekilde dur
run_the_backup
verify_the_backup    # çıktının gerçekten var olduğunu ve mantıklı olduğunu doğrula
curl -fsS https://monitorunuz/ping/abc123   # yalnızca yukarıdakilerin hepsi geçerse erişilir

set -euo pipefail, başarısız olan herhangi bir komutun pingten önce betiği durduracağı anlamına gelir. Gerçek bir doğrulama adımı eklemek (yedek dosyası var, sıfır bayttan büyük), Desen 1'deki "sıfırla bitti ama hiçbir şey yapmadı" boşluğunu kapatır.

Desen 3: Çıkış kodu sarmalayıcı

İşin kendisini değiştiremediğinizde (üçüncü taraf binary, tedarikçi betiği) onu sarın. Sarmalayıcı başlatmayı sinyalize eder, işi çalıştırır ve çıkış kodunu raporlar.

#!/bin/bash
URL=https://monitorunuz/ping/abc123
curl -fsS "$URL/start"                  # "başladım" sinyali
/opt/vendor/report-generator            # kontrol etmediğiniz iş
EXIT=$?
curl -fsS "$URL/$EXIT"                   # çıkış kodunu raporla

Başlatmayı sinyalize etmek, monitörün çalışma süresini de ölçmesine ve başlayan ama hiç bitmeyen (takılan) bir işi tespit etmesine olanak tanır. Çıkış kodunu raporlamak, "düzgün çalıştı" ile "çalıştı ve başarısız oldu" arasını ayırt etmesini sağlar.

Desen 4: Koşullu ping (yalnızca iş anlamlı olduğunda pingle)

Bazı işler zamanlamaya göre çalışır ama gerçek işi yalnızca ara sıra yapar (sıklıkla kuyruğu boş bulan bir kuyruk işleyici). İş meşru bir şekilde hiçbir şey yapmadığında "eksik heartbeat" uyarısı istemezsiniz. Yalnızca gerçek iş gerçekleştiğinde pingleyin ve zamanlamayı buna göre genişletin.

#!/bin/bash
PROCESSED=$(process_queue)
if [ "$PROCESSED" -gt 0 ]; then
  curl -fsS "https://monitorunuz/ping/abc123?count=$PROCESSED"
fi

Monitörün beklenen periyodunu, gerçek çalışmalar arasındaki en uzun gerçekçi boşluğa ayarlayın. Bedeli duyarlılıktır: daha uzun pencere daha yavaş tespit demektir, bu yüzden bunu yalnızca düzensiz iş gerçekten beklendiğinde kullanın.

Desen 5: Jitter ve grace pencereleri

Gerçek zamanlamalar kayar. 02:00'a ayarlı bir iş, yük nedeniyle 02:00:04'te başlayabilir ve günlük bir işin çalışma süresi değişkenlik gösterir. Monitör tam olarak aralıkta bir ping beklerse, normal jitter sizi gereksiz yere uyandırır.

Çözüm bir grace periyodudur: monitöre, uyarmadan önce beklenen zamandan sonra belirli bir tampon daha beklemesini söyleyin. Genellikle 8 dakika süren günlük bir yedekleme 20 dakikalık grace penceresi kullanabilir. Ayrıca, aynı kaynağı aynı saniyede zorlamamaları için çok sayıda işiniz olduğunda zamanlamada bir miktar jitter istersiniz:

# 02:00 işlerini dağıtmak için küçük rastgele bir gecikme (0-59s) ekle
0 2 * * * sleep $((RANDOM % 60)) && /usr/local/bin/backup.sh && curl -fsS https://monitorunuz/ping/abc123

Grace pencereleri, güvendiğiniz bir monitör ile üçüncü yanlış alarmdan sonra sessize aldığınız monitör arasındaki farktır. Grace'i, işin ortalamasına değil en kötü gerçekçi çalışma süresine rahatça yetecek şekilde ayarlayın.

Hızlı genel bakış

Desen En iyi olduğu Yakaladığı
Dead man's switch Tek komutlu basit işler İş çalışmadı / sıfır dışıyla bitti
Başarıda ping Çok adımlı betikler Sessiz "sıfırla bitti ama hiçbir şey yapmadı"
Çıkış kodu sarmalayıcı Değiştiremediğiniz işler Takılmalar, gerçek çıkış kodları, süre
Koşullu ping Düzensiz işli işler Yanlış "eksik" uyarısı olmadan arızalar
Jitter ve grace Değişken çalışma süreli her şey Kaymadan kaynaklı yanlış alarmları giderir

Pratiğe nasıl dökülür

En önemli işinizde bugün Desen 1 ile başlayın (yedekleme, fatura çalışması, veri senkronizasyonu). Ona güvenmeye başlamadan önce doğrulama (Desen 2) ve grace penceresi (Desen 5) ekleyin. Heartbeat yapılandırmasına dair daha ayrıntılı bir rehberi heartbeat ile cron işlerini izleme kılavuzumuzda bulabilirsiniz.

İşiniz bir servisle belirli bir port üzerinden iletişim kuruyorsa, erişilebilirliği önce ücretsiz port denetleyicisiyle doğrulayın. Ve zamanlanmış işleri web siteleri ve API'lerle birlikte tek bir yerde izlemeye hazır olduğunuzda, ePulz.io uptime izlemesinin nasıl çalıştığına bakın - 7 günlük deneme ücretsizdir, kart gerektirmez.

Paylaş: Bağlantı kopyalandı

ePulz.io'yu ücretsiz deneyin - 7 gün, kredi kartı gerekmez.

Hesap oluştur