Bir şeyin öldüğünü düşünmeden önce monitin daha uzun süre beklemesini sağlayın


20

Bir programı (Resque) başlatmaya çalışıyorum ama bir pidfile yazılmadan önce biraz zaman alıyor. Bu yüzden, Monit'in programın başlamadığını ve birincinin pid dosyası yazılmadan önce bir veya iki program başlattığını düşünüyor.

Yalnızca bu işlem için Monit'in kontrol zamanını nasıl geciktiririm? Yoksa bunu başka bir şekilde çözmeli miyim?


Aşağıya yeni bir cevap ekledim. Kontroller arasında daha uzun süre beklemek yavaş hizmetlerin çarpışmasını önleyecek olsa da, müşteriler için gerçekten kötü bir deneyim olabilir.
Eddie

Yanıtlar:


10

Yalnızca bu işlem için Monit'in kontrol zamanını nasıl geciktiririm?


Ulaşmaya çalıştığınız şey , monit " SERVİS HIZI ZAMANI " özelliği ile yapılabilir

Monit dokümantasyon diyor

Hizmetler tarafından verilen düzenli aralıklarla kontrol edilir.

set daemon n

Beyan. Denetimler, hizmetler arasında bağımlılıklar ayarlanmış olması dışında, .monitrc dosyasında yazılanlarla aynı sırada gerçekleştirilir; bu durumda, hizmetler hiyerarşisi denetimlerin sırasını değiştirebilir.

Hizmet anketini özelleştirme yöntemlerinden biri

  1. anket döngüsü uzunluğuna dayalı özel aralık çoklu

HER [sayı] DÖNGÜS

Misal:

check process resque with pidfile /your/app/root/tmp/pid/resque.pid
   every 2 cycles

Yoksa bunu başka bir şekilde çözmeli miyim?


Ayrıca monit ile kurtarma işlerini izlemek için ilk girişimde bulundum çünkü monit çok hafif bir daemon ama sonunda ALLAH'a yerleşti. Biliyorum, ALLAH'ın monit ile karşılaştırıldığında daha fazla kaynak aç olduğunu biliyorum, ancak kurtarma durumunda iyi bir eşleşme bulduk.


Teşekkürler! Her x döngüsünü kullandım. Benim için işe yarayan numarayı buldum.
Ramon Tayag

19

Belirli bir hizmeti varsayılandan farklı bir aralıkta kontrol edebilirsiniz ...

Monit belgelerindeki SERVİS HIZI ZAMANI'na bakın .

Resque programınıza bir örnek, farklı sayıda döngüyü kontrol etmek olabilir:

check process resque with pidfile /var/run/resque.pid
   every 5 cycles

veya örnekler bölümünden:

Some servers are slow starters, like for example Java based Application Servers. 
So if we want to keep the poll-cycle low (i.e. < 60 seconds) but allow some services to take its time to start, 
the every statement is handy:

 check process dynamo with pidfile /etc/dynamo.pid every 2 cycles
       start program = "/etc/init.d/dynamo start"
       stop program  = "/etc/init.d/dynamo stop"
       if failed port 8840 then alert

veya cron tarzı kontrollerden yararlanabilirsiniz.

check process resque with pidfile /var/run/resque.pid
   every 10 * * * *

veya yavaş bir başlatma yaşıyorsanız, zaman aşımını hizmet başlatma komutunda uzatabilirsiniz:

check process apache with pidfile /var/run/httpd.pid
       start program = "/etc/init.d/httpd start" with timeout 90 seconds

Aynı cevap, değil mi?
ewwhite

2
with timeout 90 secondstam olarak istediğim şeydi. Teşekkürler.
andrew

1
Zaman aşımı ve cron tarzı eklemek için şeref. Bu en doğru ve eksiksiz cevaptır.
RCross

9

Bir şeyin X kez doğrudan başarısız olup olmadığını da kontrol edebilirsiniz:

 if failed 
    port 80 
    for 10 cycles 
 then alert

Veya Y anketleri içinde X kez:

 if failed 
    port 80
    for 3 times within 5 cycles 
 then alert

Ya da her ikisi de:

 check filesystem rootfs with path /dev/hda1
  if space usage > 80% for 5 times within 15 cycles then alert
  if space usage > 90% for 5 cycles then exec '/try/to/free/the/space'

( buradan )


1
Bu, başka bir çok iyi yanıttır, çünkü varsayılan aralığı nasıl kontrol edebileceğinizi gösterir, ancak yalnızca daha affedici bir şekilde harekete geçin.
RCross

2

Ekibimin bir üyesi, monitin sık sık (her dakika) kontrol etmesini sağlayan oldukça akıllı bir çözüm buldu , ancak hizmeti yeniden başlatmaya çalıştıktan sonra (~ 10 dakika sürüyor), başlamadan önce belirli bir yetkisiz kullanım süresi bekleyecek tekrar.

Bu, yavaş başlatma ile birlikte müşteriler için çok daha büyük bir etki yaratan çekler arasında çok uzun süre beklemeyi önler. Monitin son başarısızlıktan zaten harekete geçtiğini belirtmek için bayrak görevi gören bir ara komut dosyası kullanarak çalışır.

check host bamboo with address bamboo.mysite.com
   if failed
           port 443 type tcpSSL protocol http
           and status = 200
           and request /about.action
            for 3 cycles
   then exec "/bin/bash -c 'ps -ef | grep -v "$$" | grep -v "grep" | grep restartBamboo.sh >/dev/null 2>&1; if [ $? -ne 0 ]; then /opt/monit/scripts/restartBamboo.sh; fi'"

Bambu (yavaş başlangıç ​​web uygulaması) arka arkaya 3 dakika boyunca kapalıysa, yeniden başlatın, AMA yalnızca bir yeniden başlatma komut dosyası zaten çalışmıyorsa.

Çağrılan komut dosyası, hizmet için en yavaş başlangıç ​​zamanından UZUN bir süre bekleyen belirli bir uykuya sahip (bizim durumumuzda ~ 10'da bitirmeyi umuyoruz, bu yüzden 15 için uyuyoruz)

#!/bin/bash
echo "Retarting bambo by calling init.d"
/etc/init.d/bamboo stop
echo "Stopped completed, calling start"
/etc/init.d/bamboo start
echo "Done restarting bamboo, but it will run in background for sometime before available so, we are sleeping for 15 minutes"
sleep 900
echo "done sleeping"

2

Monit'in (5.16) geçerli sürümü, söz dizimiyle başlangıç ​​komut dosyaları için bir zaman aşımını destekler:

 <START | STOP | RESTART> [PROGRAM] = "program"
    [[AS] UID <number | string>]
    [[AS] GID <number | string>]
    [[WITH] TIMEOUT <number> SECOND(S)]

Docs açıkladık:

Süreç kontrolü durumunda, Monit başlatma / durdurma eyleminin bitmesi ve bir hata bildirmeden önce 30 saniye kadar bekler. TIMEOUT seçeneğini kullanarak bu zaman aşımını geçersiz kılabilirsiniz.

"Zaman aşımı" değeri bunu yapar.


Gerçek başlatma uzun zaman alıyorsa zaman aşımını uzatmak işe yarar, ancak orijinal soruda program hızlı bir şekilde başlamış (yani geri döndü) gibi görünebilir, ancak PID'yi hemen yazmamış olabilir. Monit'e hizmeti yeniden başlattıktan sonra belirtilen süre boyunca kontrol etmemesini söylemenin bir yolu var mı?
PeterVermont

timeoutBaşlar ve yeniden hem başvurmaları gerekmektedir. Anladığım kadarıyla, Monit'in: a) çalıştığını, b) beklenen PID dosyasının oluşturulduğunu ve c) beklenen PID ile şu anda çalıştığını kontrol etmeden önce bir gecikme yapar. Belirtilen uygulamanın sadece gerçek süreci çatallayan bir komut dosyası olduğu işe başlamak için bazı sorunlar vardı sonra süreçle neler olduğunu bilmeden döndü. Bu durumda işe almak bir acıydı.
jeteon

sistem yeniden başlatılır ve hizmetlere başlarsa ne olur? her kontrol için saniye cinsinden bir başlangıç ​​gecikmesi belirtmenin bir yolu var mı? Ayrıca başlatma / durdurma ifadeleri olmadan pasif kontroller
Massimo

Bu durumda aradığınıza inanıyorum START DELAY.
jeteon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.