Sunucumun kapalı veya çevrimdışı olduğunu algılamak için Bash betiği


17

Arka plan: Sunucum çalışmadığında bir uyarı almam gerekiyor. Sunucu kapalıyken, Sysload toplayıcı herhangi bir uyarı gönderemeyebilir. Sunucu kapalıyken bir uyarı almak için, onu algılayacak harici bir kaynağım (sunucu) var.

Soru: Sunucumun devre dışı veya çevrimdışı olduğunu ve bir uyarı mesajı (E-posta + SMS) gönderdiğini tespit etmenin herhangi bir yolu var mı (bash betiğini tercih ediyorum)?

Yanıtlar:


24

Kontrol komut dosyanızı çalıştırmak için ayrı bir sunucunuz varsa, bunun gibi bir şey sunucunun hayatta olup olmadığını görmek için basit bir Ping testi yapar:

#!/bin/bash
SERVERIP=192.168.2.3
NOTIFYEMAIL=test@example.com

ping -c 3 $SERVERIP > /dev/null 2>&1
if [ $? -ne 0 ]
then
   # Use your favorite mailer here:
   mailx -s "Server $SERVERIP is down" -t "$NOTIFYEMAIL" < /dev/null 
fi

Komut dosyasını periyodik olarak çalışacak şekilde kopyalayabilirsiniz.

Mailx'iniz yoksa, bu satırı sahip olduğunuz komut satırı e-posta programıyla değiştirmeniz ve muhtemelen seçenekleri değiştirmeniz gerekir. Operatörünüz bir SMS e-posta adresi sağlıyorsa, e-postayı bu adrese gönderebilirsiniz. Örneğin, AT&T ile, phonenumber @ txt.att.net adresine bir e-posta gönderirseniz, e-posta telefonunuza gönderilir.

SMS ağ geçitlerine giden e-postaların listesi:

http://en.wikipedia.org/wiki/List_of_SMS_gateways

Sunucunuz herkese açık bir web sunucusuysa, web sitenizi izlemek ve çalışmama durumunda sizi uyarmak için bazı ücretsiz hizmetler vardır, bazılarını bulmak için web'de ücretsiz web sitesi izleme arayın .


SMS uyarı mesajı hakkında ayrıntılı bilgi verebilir misiniz?
Md Mahbubur Rahman

4
Sunucuya ping atmak yerine, sunucunun ne yaptığına önem verdiğinizi test etmelisiniz. Örneğin, bir posta sunucusu ise, başarıyla posta gönderip alması çok daha önemlidir.
Jim Paris

Soru sunucuda hangi hizmetlerin çalıştığını belirtmedi çünkü benim cevap uygulama algılama uzak kaldı - o sunucu yukarı / aşağı algılama istedi. Tespit edilebilen yüzlerce ortak hizmet ve sınırsız sayıda özel uygulama vardır. Servisleri izleyen bir yerel servis monitörüne (sysload) sahip gibi görünüyor.
Johnny

Ping benim için işe yaramaz. Bir sunucum var henüz 3 paketten 3'ü geri döndüm ve son dönüş değeri 0 olsun. Nasıl olur? Yerel makine "Hedef ana bilgisayara erişilemiyor" paketleri döndürüyor.
AlastairG

@AlastairG - bu bir soru olarak daha iyi sorulur, bir yorumda cevaplamak için yeterli alan yoktur. Ancak birisinin benzer bir soru sorduğunu görmek için önce sitede arama yapın, cevabınızı burada bulabilirsiniz.
Johnny

9

Pingleme bir seçenektir, ancak birçok durumda bir makine ping yanıtı gönderebilir, ancak asıl sunucu tamamen kapalıdır. Uçtan uca test yapmak daha iyidir. Aşağıdaki örnekte web sunucusundan bir sayfa istenmektedir.

Bir web sunucusu ise, şöyle görünecektir:

#!/bin/bash
wget -qO /dev/null 'http://webserver/some_existing_short_document.html' || {
    echo "Webserver down"
    # another mailer example
    sendemail -s mailserverip -f 'from@localhost' -t 'user@localhost' -u 'Webserver down' -m 'The webserver is down'
}

Html belgesini bir php belgesine dönüştürür ve veritabanı bağlantısı, dosya sistemleri vb. Bu şekilde, makinenin proaktif bir şekilde izlenmesini başlatabilirsiniz (sunucu çökmesine neden olmadan sorunları inceleyin).

Posta sunucusunu kontrol etmeye benzer, ancak bir web sayfası istemek yerine, posta sunucusu aracılığıyla bir e-posta gönderir ve posta kutunuzda alıp almadığınızı görürsünüz.



5

İşte aynı sorunu nasıl çözdüm

#!/bin/bash
NOTIFYEMAIL=<your email>
SMSEMAIL=<cell phone number @ sms-gateway>
SENDEREMAIL=alert@localhost
SERVER=http://127.0.0.1/
PAUSE=60
FAILED=0
DEBUG=0

while true 
do
/usr/bin/curl -sSf $SERVER > /dev/null 2>&1
CS=$?
# For debugging purposes
if [ $DEBUG -eq 1 ]
then
    echo "STATUS = $CS"
    echo "FAILED = $FAILED"
    if [ $CS -ne 0 ]
    then
        echo "$SERVER is down"

    elif [ $CS -eq 0 ]
    then
        echo "$SERVER is up"
    fi
fi

# If the server is down and no alert is sent - alert
if [ $CS -ne 0 ] && [ $FAILED -eq 0 ]
then
    FAILED=1
    if [ $DEBUG -eq 1 ]
    then
        echo "$SERVER failed"
    fi
    if [ $DEBUG = 0 ]
    then
        echo "$SERVER went down $(date)" | /usr/bin/mailx -s "$SERVER went down" -r "$SENDEREMAIL" "$SMSEMAIL" 
        echo "$SERVER went down $(date)" | /usr/bin/mailx -s "$SERVER went down" -r "$SENDEREMAIL" "$NOTIFYEMAIL" 
    fi

# If the server is back up and no alert is sent - alert
elif [ $CS -eq 0 ] && [ $FAILED -eq 1 ]
then
    FAILED=0
    if [ $DEBUG -eq 1 ]
    then
        echo "$SERVER is back up"
    fi
    if [ $DEBUG = 0 ]
    then
        echo "$SERVER is back up $(date)" | /usr/bin/mailx -s "$SERVER is back up again" -r "$SENDEREMAIL" "$SMSEMAIL"
        echo "$SERVER is back up $(date)" | /usr/bin/mailx -s "$SERVER is back up again" -r "$SENDEREMAIL" "$NOTIFYEMAIL"
    fi
fi
sleep $PAUSE
done

Mac'imde çalıştırmak için uyum sağlamak zorunda kaldım /usr/bin/mail -s "$SERVER went down" "$SENDEREMAIL" "$SMSEMAIL" .
MikeiLL

Bu çözüm kesinlikle işe yarıyor AMA. (1) Bunu yerel makinede çağırıyorsanız, sanırım apache'nin öldüğünü söyleyecek, ancak bu şekilde yapmam. (2) Bunu yerel makinede kullanıyorsanız ve ağ kapalı veya bu kutu ile onun uç sunucusu veya başka bir şey arasında bir şey varsa, e-postayı alamazsınız veya bir sorun olduğunu bilmez. (3) Bunu başka bir makinede kullanırsanız, kıvırma komutunuz belirtilmedikçe UZUN zaman aşımına uğrayacaktır, bu yüzden çoklu ana bilgisayarlara baksaydınız durma noktasına öğütülür ..
Mike Q

1

Nagios kullanmanızı kesinlikle tavsiye ederim , istediğiniz herhangi bir hizmette izleme ve uyarı için altyapıdır (birçok eklenti mevcuttur ve kendi yazabilirsiniz). Elbette sunucuların kullanılabilirliğini kontrol etmek için basit pingler yapabilir, ancak diğerlerinin işaret ettiği gibi, bunun yerine hizmetlerin kullanılabilirliğini kontrol etmek daha iyidir (örneğin, web, e-posta vb.) (Hangi nagios kolayca yapabilir).


harika bir ürün, güvenlik endişelerini merak ediyorum
Mike Q
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.