Bash script เพื่อตรวจสอบเมื่อเซิร์ฟเวอร์ของฉันไม่ทำงานหรือออฟไลน์


17

พื้นหลัง: ฉันต้องได้รับการแจ้งเตือนเมื่อเซิร์ฟเวอร์ของฉันไม่ทำงาน เมื่อเซิร์ฟเวอร์หยุดทำงานบางทีตัวรวบรวม Sysload จะไม่สามารถส่งการแจ้งเตือนใด ๆ หากต้องการรับการแจ้งเตือนเมื่อเซิร์ฟเวอร์ไม่ทำงานฉันมีแหล่งภายนอก (เซิร์ฟเวอร์) เพื่อตรวจจับ

คำถาม: มีวิธีใดบ้าง (ฉันชอบ bash script) เพื่อตรวจสอบเมื่อเซิร์ฟเวอร์ของฉันไม่ทำงานหรือออฟไลน์และส่งข้อความแจ้งเตือน (อีเมล + SMS)

คำตอบ:


24

หากคุณมีเซิร์ฟเวอร์แยกต่างหากเพื่อเรียกใช้สคริปต์ตรวจสอบสิ่งนี้จะทำการทดสอบ Ping อย่างง่ายเพื่อดูว่าเซิร์ฟเวอร์ยังมีชีวิตอยู่หรือไม่:

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

คุณสามารถ cron สคริปต์เพื่อให้ทำงานเป็นระยะ

หากคุณไม่มี mailx คุณจะต้องแทนที่บรรทัดนั้นด้วยโปรแกรมอีเมลบรรทัดคำสั่งที่คุณมีและอาจเปลี่ยนตัวเลือก หากผู้ให้บริการของคุณระบุที่อยู่อีเมล SMS คุณสามารถส่งอีเมลไปยังที่อยู่นั้นได้ ตัวอย่างเช่นกับ AT & T, ถ้าคุณส่งอีเมลไปที่PHONENUMBER @ txt.att.net ก็จะส่งอีเมลไปยังโทรศัพท์ของคุณ

นี่คือรายการอีเมลไปยังเกตเวย์ SMS:

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

หากเซิร์ฟเวอร์ของคุณเป็นเว็บเซิร์ฟเวอร์ที่สาธารณชนสามารถเข้าถึงมีบางบริการฟรีในการตรวจสอบเว็บไซต์ของคุณและแจ้งเตือนคุณถ้ามันลงค้นหาเว็บสำหรับเว็บไซต์ฟรีตรวจสอบเพื่อหาสิ่งบางอย่าง


คุณสามารถทำรายละเอียดเกี่ยวกับข้อความแจ้งเตือนทาง SMS ได้หรือไม่?
Md Mahbubur Rahman

4
แทนที่จะทดสอบเซิร์ฟเวอร์คุณควรทดสอบสิ่งที่คุณสนใจเกี่ยวกับเซิร์ฟเวอร์ ตัวอย่างเช่นหากเป็นเซิร์ฟเวอร์จดหมายสิ่งสำคัญคือการส่งและรับจดหมายสำเร็จ
จิมปารีส

ฉันอยู่ห่างจากการตรวจจับแอปพลิเคชันในคำตอบของฉันเนื่องจากคำถามไม่ได้ระบุว่าบริการใดที่ทำงานอยู่บนเซิร์ฟเวอร์ - เขาขอการตรวจสอบเซิร์ฟเวอร์ขึ้น / ลง มีบริการทั่วไปหลายร้อยรายการที่สามารถตรวจพบได้และแอปพลิเคชันที่กำหนดเองไม่ จำกัด จำนวน ดูเหมือนว่าเขามีบริการตรวจสอบภายในเครื่อง (sysload) ที่ตรวจสอบบริการ
จอห์นนี่

Ping ทั้งหมด แต่ไร้ประโยชน์สำหรับฉัน ฉันลงเซิร์ฟเวอร์แล้ว แต่ฉันได้รับ 3 จาก 3 แพ็คเก็ตที่ส่งคืนและค่าส่งคืนสุดท้ายเป็น 0 ทำไมจึงเป็นเช่นนั้น เครื่องท้องถิ่นกำลังส่งคืนแพ็กเก็ต "ปลายทางโฮสต์ที่ไม่สามารถเข้าถึงได้"
AlastairG

@AlastairG - นี่จะถามคำถามได้ดีกว่าว่ามีความคิดเห็นไม่เพียงพอที่จะตอบ แต่ค้นหาเว็บไซต์ก่อนเพื่อดูว่ามีคนถามคำถามที่คล้ายกันหรือไม่คุณอาจพบคำตอบที่นั่น
จอห์นนี่

9

การส่ง Ping เป็นตัวเลือก แต่ในหลาย ๆ ครั้งเครื่องจะสามารถส่งคำตอบ ping ได้ในขณะที่เซิร์ฟเวอร์จริงที่กำลังจะปิดตัวลง มันเป็นการทดสอบที่ดีที่สุด ในตัวอย่างด้านล่างหน้ามีการร้องขอจากเว็บเซิร์ฟเวอร์

หากเป็นเว็บเซิร์ฟเวอร์ก็จะมีลักษณะดังนี้:

#!/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 เป็นเอกสาร php และทำการทดสอบสคริปต์ php เช่นการเชื่อมต่อฐานข้อมูลระบบไฟล์ ฯลฯ คุณสามารถทดสอบด้านอื่น ๆ ของเซิร์ฟเวอร์ได้ ด้วยวิธีนี้คุณสามารถเริ่มการตรวจสอบเชิงรุกของเครื่อง (ดูปัญหาก่อนที่จะทำให้เซิร์ฟเวอร์เสียหาย)

เช่นเดียวกับการตรวจสอบเมลเซิร์ฟเวอร์ แต่แทนที่จะขอเว็บเพจคุณเพียงแค่ส่งอีเมลผ่านเมลเซิร์ฟเวอร์และดูว่าคุณได้รับอีเมลนั้นในกล่องจดหมายหรือไม่


หากคุณได้รับอีเมลรากส่งต่อไปยังกล่องจดหมายของคุณคุณไม่ต้อง sendmail ถ้าคุณรันสคริปต์นี้ใน crontab (เพราะมันจะส่ง stdout ให้คุณ)
pscheit

5

นี่คือวิธีที่ฉันแก้ไขปัญหาเดียวกัน

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

ผมต้องปรับให้เข้ากับการทำงานบน /usr/bin/mail -s "$SERVER went down" "$SENDEREMAIL" "$SMSEMAIL" Mac
MikeiLL

วิธีนี้ใช้งานได้ดี แต่แน่นอน (1) ถ้าคุณเรียกสิ่งนี้ในเครื่องท้องถิ่นฉันคิดว่ามันจะบอกคุณว่าอะแพชเสียชีวิตแม้ว่าฉันจะไม่ทำแบบนี้ (2) ถ้าคุณใช้สิ่งนี้กับเครื่องในพื้นที่และเครือข่ายไม่ทำงานหรือมีอะไรบางอย่างระหว่างกล่องนี้กับเซิร์ฟเวอร์ขอบหรือบางอย่างคุณจะไม่ได้รับอีเมลและจะไม่ทราบว่ามีปัญหา (3) ถ้าคุณใช้สิ่งนี้กับเครื่องอื่นคำสั่ง curl ของคุณจะใช้เวลานานจนกว่าจะหมดเวลาหากไม่ได้ระบุไว้ดังนั้นหากคุณกำลังมองหาโฮสต์ mulitple มันจะถูกบดให้หยุด ..
Mike

1

ฉันอยากจะแนะนำให้ใช้Nagiosเป็นโครงสร้างพื้นฐานสำหรับการตรวจสอบและแจ้งเตือนเกี่ยวกับบริการใด ๆ ที่คุณต้องการ (มีปลั๊กอินจำนวนมากและคุณสามารถเขียนเอง) แน่นอนว่ามันสามารถทำการปิงอย่างง่าย ๆ เพื่อตรวจสอบความพร้อมใช้งานของเซิร์ฟเวอร์ แต่อย่างที่คนอื่น ๆ ชี้ไปมันจะเป็นการดีกว่าที่จะตรวจสอบความพร้อมใช้งานของบริการ (เช่นเว็บอีเมล ฯลฯ ) แทน


มันเป็นผลิตภัณฑ์ที่ยอดเยี่ยมฉันสงสัยเกี่ยวกับความปลอดภัย
Mike Q
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.