Skrip Bash untuk mendeteksi kapan server saya mati atau offline

17

Latar Belakang: Saya perlu menerima peringatan ketika server saya tidak aktif. Ketika server sedang down, mungkin kolektor Sysload tidak akan dapat mengirim peringatan. Untuk menerima peringatan ketika server sedang down, saya memiliki sumber eksternal (server) untuk mendeteksinya.

Pertanyaan: Apakah ada cara (saya lebih suka skrip bash) untuk mendeteksi kapan server saya mati atau offline dan mengirim pesan peringatan (Email + SMS)?

Md Mahbubur Rahman
sumber

Jawaban:

24

Jika Anda memiliki server terpisah untuk menjalankan skrip cek Anda, sesuatu seperti ini akan melakukan tes Ping sederhana untuk melihat apakah server masih hidup:

#!/bin/bash
SERVERIP=192.168.2.3
[email protected]

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

Anda dapat menyalin skrip untuk dijalankan secara berkala.

Jika Anda tidak memiliki mailx, Anda harus mengganti baris itu dengan program email baris perintah apa pun yang Anda miliki dan mungkin mengubah opsi. Jika operator Anda memberikan alamat email SMS, Anda dapat mengirim email ke alamat itu. Misalnya, dengan AT&T, jika Anda mengirim email ke phonenumber @ txt.att.net, itu akan mengirim email ke ponsel Anda.

Berikut daftar email ke SMS gateway:

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

Jika server Anda adalah server web yang dapat diakses publik, ada beberapa layanan gratis untuk memantau situs web Anda dan memberi tahu Anda jika sedang down, cari web untuk pemantauan situs web gratis untuk menemukannya.

Johnny
sumber
Bisakah Anda membuat detail tentang pesan peringatan SMS?
Md Mahbubur Rahman
4
Alih-alih melakukan ping server, Anda harus menguji apa pun yang Anda pedulikan dari server. Misalnya, jika ini adalah server email, jauh lebih penting untuk berhasil mengirim dan menerima email.
Jim Paris
Saya menjauh dari deteksi aplikasi dalam jawaban saya karena pertanyaannya tidak menentukan layanan apa yang berjalan di server - ia meminta deteksi atas / bawah server. Ada ratusan layanan umum yang dapat dideteksi dan aplikasi kustom dalam jumlah yang tidak terbatas. Sepertinya dia memiliki monitor layanan lokal (sysload) yang memantau layanan.
Johnny
Ping tidak berguna bagi saya. Saya memiliki server turun namun saya mendapatkan 3 dari 3 paket yang dikembalikan dan nilai pengembalian akhir 0. Bagaimana bisa? Mesin lokal mengembalikan paket "Destination host unreachable".
AlastairG
@AlastairG - ini akan lebih baik ditanyakan sebagai pertanyaan, tidak ada cukup ruang dalam komentar untuk menjawabnya. Tetapi cari situs terlebih dahulu untuk melihat apakah seseorang mengajukan pertanyaan serupa, Anda dapat menemukan jawaban Anda di sana.
Johnny
9

Ping adalah sebuah pilihan, tetapi pada banyak kesempatan sebuah mesin akan dapat mengirim balasan ping, sementara server sebenarnya adalah semua yang ada di bawah. Lebih baik melakukan tes ujung ke ujung. Dalam contoh di bawah ini sebuah halaman diminta dari server web.

Jika itu adalah server web, akan terlihat seperti ini:

#!/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'
}

Jika Anda mengubah dokumen html menjadi dokumen php, dan membuat de php script menguji hal-hal seperti koneksi basis data, sistem file dll., Anda bahkan dapat menguji lebih banyak aspek server. Dengan begitu Anda dapat memulai pemantauan proaktif mesin (lihat masalah sebelum mereka membuat server crash).

Mirip dengan memeriksa server surat, tetapi alih-alih meminta halaman web, Anda cukup mengirim email melalui server surat dan melihat apakah Anda menerimanya di kotak surat Anda

jippie
sumber
jika Anda mendapatkan email root yang diteruskan ke kotak masuk Anda, Anda tidak perlu mengirim email jika Anda mengeksekusi skrip ini di crontab (karena akan mengirim stdout kepada Anda)
pscheit
5

Inilah cara saya memecahkan masalah yang sama

#!/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
pengguna54782
sumber
Saya harus beradaptasi untuk berjalan di mac saya /usr/bin/mail -s "$SERVER went down" "$SENDEREMAIL" "$SMSEMAIL" .
MikeiLL
Solusi ini pasti bekerja TETAPI. (1) jika Anda memanggil ini pada mesin lokal saya kira itu akan memberitahu Anda bahwa apache mati, meskipun saya tidak akan melakukannya dengan cara ini. (2) Jika Anda menggunakan ini pada mesin lokal dan jaringan sedang down atau sesuatu di antara kotak ini dan itu server tepi atau sesuatu, Anda tidak akan mendapatkan email dan atau tidak akan tahu ada masalah. (3) Jika Anda menggunakan ini di komputer lain, perintah curl Anda akan membutuhkan waktu LAMA untuk waktu yang lama kecuali ditentukan, jadi jika Anda melihat host mulitple, itu akan terhenti ..
Mike Q
1

Saya akan sangat merekomendasikan menggunakan Nagios , ini adalah infrastruktur untuk memantau dan mengingatkan layanan apa pun yang Anda inginkan (banyak plugin tersedia dan Anda dapat menulis sendiri). Tentu saja dapat melakukan ping sederhana untuk memeriksa ketersediaan server, tetapi seperti yang telah ditunjukkan orang lain, lebih baik memeriksa ketersediaan layanan (misalnya web, email, dll.) (Yang nagios dapat lakukan dengan mudah).

emerino
sumber
itu produk yang keren, saya ingin tahu tentang masalah keamanan
Mike Q