Bash script kiểm tra và thông báo Disk, CPU, RAM tới Telegram (cập nhập 2025)

Đây là một bash script để giám sát và cảnh báo sử dụng tài nguyên hệ thống (Disk, CPU, RAM) vượt quá ngưỡng cho phép, script sẽ gửi cảnh báo qua Telegram nếu các tài nguyên vượt qua ngưỡng trong một khoảng thời gian nhất định.

Phiên bản này cập nhập lại 1 chút so với bản cũ ban đầu, cụ thể nó sẽ kiểm tra khi vượt ngưỡng trong 1 thời gian cố định (5s) sau đó mới gửi thông báo, bổ xung thêm số thông báo tối đa gửi trong 5 phút, tránh chuyện gửi quá nhiều tin nhắn thông báo

Đầu tiên là tạo 1 con chat bot Telegram, ví dụ

  • Bot Token 6360723418:AAF1aya50fEi6sVuOwhXp53Ic19siP3gqLc
  • Chat ID 489842537″

Tạo 1 file bash bên trong /usr/local/bin/, có thể đặt tên là monitor_cpu_ram_hdd.sh

touch /usr/local/bin/monitor_cpu_ram_hdd.sh
nano /usr/local/bin/monitor_cpu_ram_hdd.sh

Nội dung bên trong điền vào

#!/bin/bash

# Thiết lập ngưỡng cảnh báo cho việc sử dụng đĩa, CPU và RAM
DISK_THRESHOLD=50 # Ngưỡng sử dụng đĩa (%)
CPU_THRESHOLD=80  # Ngưỡng sử dụng CPU (%)
RAM_THRESHOLD=50  # Ngưỡng sử dụng RAM (%)

# Thiết lập thông tin API của bot Telegram và chat ID
BOT_API_KEY="xxxxxxxxxxxxxxxxxxxxxxxx"
CHAT_ID="xxxxxxxxxx"

# Thiết lập thời gian chờ giữa các cảnh báo (tính bằng giây)
COOLDOWN_SECONDS=300  # 5 phút

# Thiết lập khoảng thời gian giữa các lần kiểm tra (tính bằng giây)
CHECK_INTERVAL=1      # 1 giây

# Thiết lập thời gian kiểm tra liên tục (tính bằng giây)
DELAY_SECONDS=5      # 5 giây

# Theo dõi thời gian gửi cảnh báo cuối cùng
LAST_ALERT_TIME=0

# Hàm gửi tin nhắn đến Telegram
send_telegram_message() {
    local message=$1
    curl -s -X POST "https://api.telegram.org/bot${BOT_API_KEY}/sendMessage" \
        -d "chat_id=${CHAT_ID}" \
        -d "text=${message}" \
        -d "parse_mode=HTML"
}

# Hàm kiểm tra xem tài nguyên có vượt ngưỡng liên tục trong DELAY_SECONDS không
check_resource_usage() {
    local usage_command=$1  # Lệnh để lấy thông tin sử dụng tài nguyên
    local threshold=$2      # Ngưỡng cảnh báo
    local resource_name=$3  # Tên tài nguyên (đĩa, CPU, RAM)
    
    local exceeded_duration=0        # Biến theo dõi thời gian tài nguyên vượt ngưỡng
    local end_time=$(( $(date +%s) + DELAY_SECONDS ))  # Thời gian kết thúc kiểm tra
    
    # Kiểm tra liên tục trong khoảng thời gian DELAY_SECONDS
    while [ $(date +%s) -lt $end_time ]; do
        usage=$(eval "$usage_command")  # Lấy giá trị sử dụng tài nguyên
        if [ "$usage" -ge "$threshold" ]; then
            exceeded_duration=$((exceeded_duration + CHECK_INTERVAL))  # Tăng thời gian tài nguyên vượt ngưỡng
        else
            exceeded_duration=0  # Reset nếu tài nguyên không còn vượt ngưỡng
        fi
        
        # Nếu thời gian tài nguyên vượt ngưỡng đủ lâu thì trả về 0
        if [ "$exceeded_duration" -ge "$DELAY_SECONDS" ]; then
            return 0  # Vượt ngưỡng trong thời gian yêu cầu
        fi
        
        sleep "$CHECK_INTERVAL"  # Chờ giữa các lần kiểm tra
    done
    
    return 1  # Nếu không vượt ngưỡng đủ lâu
}

# Hàm gửi cảnh báo nếu việc sử dụng tài nguyên vượt quá ngưỡng
send_alert_if_exceeded() {
    local usage_command=$1  # Lệnh để lấy thông tin sử dụng tài nguyên
    local threshold=$2      # Ngưỡng cảnh báo
    local resource_name=$3  # Tên tài nguyên (đĩa, CPU, RAM)
    local current_time=$(date +%s)  # Thời gian hiện tại
    
    # Kiểm tra xem tài nguyên có vượt ngưỡng liên tục không
    if check_resource_usage "$usage_command" "$threshold" "$resource_name"; then
        usage=$(eval "$usage_command")  # Lấy giá trị sử dụng tài nguyên
        
        # Lấy thời gian cảnh báo theo múi giờ Việt Nam
        vietnam_time=$(TZ="Asia/Ho_Chi_Minh" date "+%d-%m-%Y %H:%M:%S")
        
        # Tạo thông điệp cảnh báo chi tiết
        message=$(echo -e "<b>CẢNH BÁO SỬ DỤNG ${resource_name^^}</b>\n\n\
        <b>Tình trạng:</b> Tài nguyên ${resource_name} đã vượt quá ngưỡng trong hơn ${DELAY_SECONDS} giây.\n\
        <b>Giá trị hiện tại:</b> ${usage}%\n\
        <b>Ngưỡng quy định:</b> ${threshold}%\n\
        <b>Thời gian vượt ngưỡng:</b> ${vietnam_time}\n\
        <b>Chú ý:</b> Vui lòng kiểm tra lại hệ thống để tránh ảnh hưởng đến hiệu suất hoạt động.")
        
        # Kiểm tra thời gian chờ giữa các cảnh báo
        if [ $((current_time - LAST_ALERT_TIME)) -ge "$COOLDOWN_SECONDS" ]; then
            send_telegram_message "$message"  # Gửi cảnh báo qua Telegram
            LAST_ALERT_TIME=$current_time     # Cập nhật thời gian gửi cảnh báo cuối cùng
        fi
    fi
}

# Vòng lặp chính để kiểm tra tài nguyên
while true
do
    # Kiểm tra sử dụng đĩa
    send_alert_if_exceeded "df / | awk '/\// {print \$5}' | sed 's/%//'" "$DISK_THRESHOLD" "disk"

    # Kiểm tra sử dụng CPU
    send_alert_if_exceeded "top -b -n 1 | awk '/^%Cpu/ {print \$2}' | cut -d '.' -f 1" "$CPU_THRESHOLD" "cpu"

    # Kiểm tra sử dụng RAM
    send_alert_if_exceeded "free | awk '/^Mem/ {print \$3/\$2 * 100.0}' | cut -d '.' -f 1" "$RAM_THRESHOLD" "ram"

    # Đợi một khoảng thời gian trước khi kiểm tra lại
    sleep "$CHECK_INTERVAL"
done
  • DISK_THRESHOLD: Ngưỡng cảnh báo cho việc sử dụng đĩa, tính theo %
  • CPU_THRESHOLD: Ngưỡng cảnh báo cho việc sử dụng CPU, tính theo %
  • RAM_THRESHOLD: Ngưỡng cảnh báo cho việc sử dụng RAM, tính theo %
  • BOT_API_KEY: API key của bot Telegram mà bạn sử dụng để gửi tin nhắn.
  • CHAT_ID: ID của kênh hoặc chat mà bạn muốn gửi cảnh báo.
  • COOLDOWN_SECONDS: Thời gian chờ (tính bằng giây) giữa các cảnh báo (để tránh gửi cảnh báo liên tục).
  • CHECK_INTERVAL: Khoảng thời gian (tính bằng giây) giữa các lần kiểm tra tài nguyên
  • DELAY_SECONDS: Thời gian kiểm tra liên tục (tính bằng giây) xem tài nguyên có vượt ngưỡng trong khoảng thời gian này hay không.
  • LAST_ALERT_TIME: Để như mặc định là được

Ý nghĩa của đoạn code trên là nó cứ check tình trạng của Disk, CPU, RAM

  • Nếu Disk, CPU, RAM sử dụng < 50%-80% thì không làm gì
  • Nếu Disk, CPU, RAM sử dụng > 50%-80% trong liên tục 5s: gửi thông báo tới Telegram
  • Nếu Disk, CPU, RAM sử dụng > 50%-80% tiếp tục: sau 5 phút nữa mới có thông báo mới

Tiếp theo chạy các dòng code bên dưới để nó tự chạy ngầm và tự chạy lại sau khi reboot VPS

chmod +x /usr/local/bin/monitor_cpu_ram_hdd.sh
nohup /usr/local/bin/monitor_cpu_ram_hdd.sh >> ./out 2>&1 <&- &
crontab -l > monitor_service_cpu_ram_hdd
echo "@reboot nohup /usr/local/bin/monitor_cpu_ram_hdd.sh >> ./out 2>&1 <&- &" >> monitor_service_cpu_ram_hdd
crontab monitor_service_cpu_ram_hdd

Code chạy khá nhẹ, trung bình dùng tầm 0.1% CPU gì đó, nói chung không đáng kể, nên cài thêm vào để kiểm soát Disk, CPU, RAM tốt hơn


Related Posts

Chính sách bình luận: Chúng tôi rất trân trọng các bình luận của bạn và cảm ơn thời gian bạn dành để chia sẻ ý tưởng và phản hồi.
Ghi chú: Những bình luận được xác định là spam hoặc chỉ mang tính quảng cáo sẽ bị xóa.

• Để cải thiện trải nghiệm bình luận, chúng tôi khuyến khích bạn tạo một tài khoản Gravatar. Thêm avatar vào tài khoản Gravatar sẽ giúp bình luận của bạn dễ nhận diện hơn đối với các thành viên khác.

✂️ Sao chép và 📋 Dán Emoji 💪 giúp bình luận thêm sinh động và thú vị!