Tập lệnh Bash để phát hiện khi máy chủ của tôi ngừng hoạt động hoặc ngoại tuyến


17

Bối cảnh: Tôi cần nhận được cảnh báo khi máy chủ của tôi không hoạt động. Khi máy chủ ngừng hoạt động, có thể trình thu thập Sysload sẽ không thể gửi bất kỳ cảnh báo nào. Để nhận được cảnh báo khi máy chủ ngừng hoạt động, tôi có một nguồn bên ngoài (máy chủ) để phát hiện nó.

Câu hỏi: Có cách nào (tôi thích bash script) để phát hiện khi máy chủ của tôi ngừng hoạt động hoặc ngoại tuyến và gửi một thông báo cảnh báo (Email + SMS) không?

Câu trả lời:


24

Nếu bạn có một máy chủ riêng để chạy tập lệnh kiểm tra của mình, một cái gì đó như thế này sẽ thực hiện kiểm tra Ping đơn giản để xem máy chủ có còn sống không:

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

Bạn có thể cron script để chạy định kỳ.

Nếu bạn không có mailx, bạn sẽ phải thay thế dòng đó bằng bất kỳ chương trình email dòng lệnh nào bạn có và có thể thay đổi các tùy chọn. Nếu nhà cung cấp dịch vụ của bạn cung cấp địa chỉ email SMS, bạn có thể gửi email đến địa chỉ đó. Ví dụ: với AT & T, nếu bạn gửi email đến phonenumber @ txt.att.net, nó sẽ gửi email đến điện thoại của bạn.

Dưới đây là danh sách email đến các cổng SMS:

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

Nếu máy chủ của bạn là một máy chủ web có thể truy cập công khai, có một số dịch vụ miễn phí để theo dõi trang web của bạn và cảnh báo bạn nếu nó bị hỏng, hãy tìm kiếm trên web để theo dõi trang web miễn phí để tìm một số.


Bạn có thể làm chi tiết về tin nhắn cảnh báo SMS không?
Md Mahbubur Rahman

4
Thay vì ping máy chủ, bạn nên kiểm tra bất cứ điều gì mà bạn quan tâm về máy chủ đang làm. Ví dụ: nếu là máy chủ thư, điều quan trọng hơn là nó gửi và nhận thư thành công.
Jim Paris

Tôi tránh xa việc phát hiện ứng dụng trong câu trả lời của mình vì câu hỏi không chỉ định dịch vụ nào đang chạy trên máy chủ - anh ấy đã yêu cầu phát hiện lên / xuống máy chủ. Có hàng trăm dịch vụ phổ biến có thể được phát hiện và không giới hạn số lượng ứng dụng tùy chỉnh. Có vẻ như anh ta có một giám sát dịch vụ địa phương (sysload) đang theo dõi các dịch vụ.
Johnny

Ping là tất cả nhưng vô dụng đối với tôi. Tôi có một máy chủ ngừng hoạt động nhưng tôi nhận được 3 trong số 3 gói được trả về và giá trị trả về cuối cùng là 0. Làm thế nào? Máy cục bộ đang trả về các gói "Máy chủ đích không thể truy cập".
AlastairG

@AlastairG - câu hỏi này sẽ được hỏi tốt hơn, không có đủ chỗ trong một bình luận để trả lời nó. Nhưng tìm kiếm trang web đầu tiên để xem nếu ai đó hỏi một câu hỏi tương tự, bạn có thể tìm thấy câu trả lời của bạn ở đó.
Johnny

9

Ping là một tùy chọn, nhưng trong nhiều trường hợp, một máy sẽ có thể gửi trả lời ping, trong khi máy chủ thực tế mà tất cả đều ngừng hoạt động. Tốt hơn là làm một bài kiểm tra đầu cuối. Trong ví dụ dưới đây, một trang được yêu cầu từ máy chủ web.

Nếu nó là một máy chủ web, nó sẽ trông giống như thế này:

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

Nếu bạn thay đổi tài liệu html thành tài liệu php và tạo tập lệnh de php kiểm tra những thứ như kết nối cơ sở dữ liệu, hệ thống tệp, v.v., bạn thậm chí có thể kiểm tra nhiều khía cạnh khác của máy chủ. Bằng cách đó, bạn có thể bắt đầu chủ động giám sát máy (xem các sự cố trước khi chúng làm máy chủ gặp sự cố).

Tương tự như việc kiểm tra máy chủ thư, nhưng thay vì yêu cầu một trang web, bạn chỉ cần gửi email qua máy chủ thư và xem bạn có nhận được nó trong hộp thư của mình không


nếu bạn nhận được email gốc được chuyển tiếp đến hộp thư đến của mình, bạn không phải gửi mail nếu bạn thực thi tập lệnh này trong crontab (vì nó sẽ gửi thiết bị xuất chuẩn cho bạn)
pscheit

5

Đây là cách tôi giải quyết vấn đề tương tự

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

Tôi đã phải thích nghi để chạy trên máy mac của tôi /usr/bin/mail -s "$SERVER went down" "$SENDEREMAIL" "$SMSEMAIL" .
MikeiLL

Giải pháp này chắc chắn hoạt động NHƯNG. (1) nếu bạn gọi nó trên máy cục bộ, tôi đoán nó sẽ cho bạn biết rằng apache đã chết, mặc dù tôi sẽ không làm theo cách này. (2) Nếu bạn sử dụng điều này trên máy cục bộ và mạng bị hỏng hoặc có gì đó giữa hộp này và máy chủ biên hoặc một cái gì đó, bạn sẽ không nhận được email và nó sẽ không biết có vấn đề. (3) Nếu bạn sử dụng này trên máy khác, lệnh curl của bạn sẽ mất nhiều thời gian để thời gian ra trừ khi quy định, vì vậy Ifyou đang tìm kiếm tại host mulitple nó sẽ dễ bị trì trệ ..
Mike Q

1

Tôi rất khuyên bạn nên sử dụng Nagios , đây là cơ sở hạ tầng để theo dõi và cảnh báo về bất kỳ dịch vụ nào bạn muốn (có nhiều plugin có sẵn và bạn có thể tự viết). Tất nhiên nó có thể thực hiện các lệnh đơn giản để kiểm tra tính khả dụng của máy chủ, nhưng như những người khác đã chỉ ra, tốt hơn là kiểm tra tính khả dụng của dịch vụ (ví dụ: web, email, v.v.) thay vào đó (điều mà nagios có thể làm dễ dàng).


đó là một sản phẩm tuyệt vời, tôi tự hỏi về những lo ngại về bảo mật
Mike Q
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.