Đâ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ênDELAY_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
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ị!