Vì sao cần Monitor VPS bằng Telegram bot khi CPU/disk/RAM cao ngay?
Nỗi đau lớn nhất của quản trị viên hệ thống là VPS sập khi đang ngủ say. Bạn thức dậy với hàng tá tin nhắn phàn nàn từ khách hàng vì website không thể truy cập. Nguyên nhân thường rất đơn giản: ổ cứng đầy do log, hoặc một tiến trình lỗi “ăn” sạch RAM.
Việc thiết lập hệ thống cảnh báo sớm qua Telegram giúp bạn giải quyết triệt để vấn đề này. Dưới đây là những lý do bạn cần triển khai ngay:
- 🚨 Phản ứng tức thời: Nhận thông báo ngay lập tức trên điện thoại khi tài nguyên chạm ngưỡng nguy hiểm.
- 💸 Tiết kiệm chi phí: Không cần thuê các dịch vụ giám sát SaaS đắt đỏ, tận dụng hoàn toàn công cụ miễn phí.
- 🛡️ Bảo vệ tiến trình Backup: Ổ cứng đầy (Disk 100%) sẽ khiến các tác vụ sao lưu (backup) thất bại hoàn toàn.
- 🤖 Dễ dàng tùy biến: Tự do thêm bớt các chỉ số cần theo dõi (Nginx, Docker, MySQL) theo nhu cầu thực tế.
- 📊 Nhẹ và tối ưu: Script Bash tiêu tốn chưa đến 1MB RAM, không gây áp lực lên máy chủ như các agent giám sát nặng nề.
Lấy Token và Chat ID từ Telegram API
Tóm gọn: Bạn cần tạo một con Bot qua BotFather và lấy Chat ID của cá nhân hoặc nhóm để làm đích đến cho các cảnh báo.
Bước 1: Khởi tạo Bot với BotFather
Mở ứng dụng Telegram và tìm kiếm tài khoản @BotFather. Đây là bot chính thức của Telegram dùng để quản lý tất cả các bot khác.
Bạn gõ lệnh /newbot và làm theo hướng dẫn để đặt tên cho Bot. Sau khi hoàn tất, BotFather sẽ cung cấp cho bạn một chuỗi API Token.
# Ví dụ về định dạng của Telegram Bot Token (Tuyệt đối không chia sẻ mã này)
1234567890:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw
💡 Mẹo: Hãy lưu ngay Token này vào một file text an toàn trên máy tính. Nếu bạn làm lộ Token, bất kỳ ai cũng có thể điều khiển bot của bạn.
Bước 2: Lấy Chat ID để nhận tin nhắn
Tiếp theo, bạn cần tìm Chat ID (mã định danh cuộc trò chuyện). Hãy gửi một tin nhắn bất kỳ (ví dụ: “hello”) cho con Bot bạn vừa tạo.
Sau đó, mở terminal trên máy tính hoặc VPS và chạy lệnh curl sau để gọi API của Telegram. Hãy thay thế YOUR_BOT_TOKEN bằng token thực tế của bạn.
curl -s "https://api.telegram.org/botYOUR_BOT_TOKEN/getUpdates" | jq .
Output trả về sẽ là một chuỗi JSON chứa thông tin tin nhắn. Bạn hãy tìm trường id nằm trong block chat.
{
"ok": true,
"result": [
{
"update_id": 987654321,
"message": {
"message_id": 2,
"from": {
"id": 1122334455,
"is_bot": false,
"first_name": "Admin"
},
"chat": {
"id": 1122334455,
"first_name": "Admin",
"type": "private"
},
"date": 1690000000,
"text": "hello"
}
}
]
}
Giải thích các tùy chọn trong lệnh:
* -s (silent): Ẩn thanh tiến trình tải xuống của curl, giúp output gọn gàng hơn.
* | jq .: Pipe (chuyển) kết quả sang công cụ jq để format chuỗi JSON cho dễ đọc. (Cần cài đặt jq qua apt install jq).
* chat.id: Đây chính là dãy số bạn cần lưu lại (trong ví dụ là 1122334455). Dãy số này có thể bắt đầu bằng dấu trừ - nếu đó là một Group.
Viết Bash Script giám sát tài nguyên VPS
Tóm gọn: Sử dụng các lệnh Linux cơ bản (mpstat, free, df) kết hợp với awk để trích xuất chỉ số tài nguyên và gửi cảnh báo nếu vượt ngưỡng.
Bước 1: Cài đặt các gói phụ thuộc
Trước khi viết script, VPS Ubuntu 22.04/24.04 của bạn cần công cụ sysstat để đo lường CPU chính xác. Lệnh top thường không phản ánh đúng mức tải tức thời trong script tự động.
sudo apt update
sudo apt install sysstat curl -y
Bước 2: Tạo file Script monitor.sh
Tạo một thư mục chứa script để dễ quản lý, ví dụ /opt/scripts/. Sau đó dùng nano để tạo file monitor.sh.
sudo mkdir -p /opt/scripts
sudo nano /opt/scripts/monitor.sh
Dán đoạn mã Bash sau vào file. Đừng quên thay thế TOKEN và CHAT_ID bằng thông tin bạn đã lấy ở phần trước.
#!/bin/bash
# Cấu hình Telegram
TOKEN="1234567890:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw"
CHAT_ID="1122334455"
# Cấu hình ngưỡng cảnh báo (Threshold)
CPU_THRESHOLD=85
RAM_THRESHOLD=90
DISK_THRESHOLD=90
# Lấy thông tin Hostname và IP
HOSTNAME=$(hostname)
IP_ADDR=$(hostname -I | awk '{print $1}')
# 1. Kiểm tra CPU (Sử dụng mpstat)
CPU_IDLE=$(mpstat 1 1 | awk '/Average/ {print $NF}')
CPU_USAGE=$(echo "100 - $CPU_IDLE" | bc | awk '{printf "%.0f", $1}')
# 2. Kiểm tra RAM (Sử dụng free)
RAM_USAGE=$(free -m | awk 'NR==2{printf "%.0f", $3*100/$2 }')
# 3. Kiểm tra Disk (Sử dụng df)
DISK_USAGE=$(df -h / | awk '$NF=="/"{printf "%d", $5}')
# Xây dựng nội dung tin nhắn
MESSAGE="🚨 <b>CẢNH BÁO VPS: $HOSTNAME ($IP_ADDR)</b>%0A"
ALERT_TRIGGERED=0
if [ "$CPU_USAGE" -ge "$CPU_THRESHOLD" ]; then
MESSAGE="$MESSAGE%0A- CPU Usage: <b>$CPU_USAGE%</b> (Ngưỡng: $CPU_THRESHOLD%)"
ALERT_TRIGGERED=1
fi
if [ "$RAM_USAGE" -ge "$RAM_THRESHOLD" ]; then
MESSAGE="$MESSAGE%0A- RAM Usage: <b>$RAM_USAGE%</b> (Ngưỡng: $RAM_THRESHOLD%)"
ALERT_TRIGGERED=1
fi
if [ "$DISK_USAGE" -ge "$DISK_THRESHOLD" ]; then
MESSAGE="$MESSAGE%0A- Disk Usage: <b>$DISK_USAGE%</b> (Ngưỡng: $DISK_THRESHOLD%)"
ALERT_TRIGGERED=1
fi
# Gửi tin nhắn nếu có cảnh báo
if [ "$ALERT_TRIGGERED" -eq 1 ]; then
curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" \
-d chat_id="$CHAT_ID" \
-d text="$MESSAGE" \
-d parse_mode="HTML" > /dev/null
fi
Output mẫu nhận được trên ứng dụng Telegram khi VPS quá tải:
🚨 CẢNH BÁO VPS: web-server-01 (192.168.1.50)
- CPU Usage: 95% (Ngưỡng: 85%)
- RAM Usage: 92% (Ngưỡng: 90%)
Giải thích các thành phần trong Script:
* mpstat 1 1: Lấy mẫu CPU 1 lần trong 1 giây. Lệnh awk '/Average/ {print $NF}' lấy cột cuối cùng (chỉ số %idle – CPU rảnh).
* bc: Công cụ tính toán dòng lệnh. Dùng để lấy 100 - %idle ra % CPU đang sử dụng.
* free -m: Hiển thị RAM theo Megabyte. NR==2 chỉ định dòng thứ 2 (dòng Mem). Công thức $3*100/$2 tính phần trăm RAM đã dùng.
* df -h /: Kiểm tra dung lượng phân vùng root (/). Ký tự % được tự động loại bỏ nhờ định dạng %d trong awk.
* parse_mode="HTML": Cho phép Telegram hiển thị các thẻ in đậm <b> để tin nhắn dễ đọc (scannable) hơn.
⚠️ Cảnh báo: Không nên đặt ngưỡng (Threshold) quá thấp, ví dụ như 60%. Các đợt spike (tăng đột biến) ngắn hạn là bình thường, đặt ngưỡng thấp sẽ khiến bạn bị “spam” tin nhắn liên tục.
Tích hợp kiểm tra trạng thái NGINX và Docker
Tóm gọn: Ngoài tài nguyên phần cứng, bạn có thể mở rộng script để giám sát các dịch vụ quan trọng (services) như web server hoặc container.
Bước 1: Bổ sung logic check systemd (NGINX)
Nếu bạn chạy NGINX (phiên bản 1.18 trở lên) trực tiếp trên Ubuntu, lệnh systemctl là cách tốt nhất để kiểm tra. Hãy thêm đoạn mã sau vào trước phần # Gửi tin nhắn trong file monitor.sh.
# Kiểm tra NGINX
NGINX_STATUS=$(systemctl is-active nginx)
if [ "$NGINX_STATUS" != "active" ]; then
MESSAGE="$MESSAGE%0A- ❌ NGINX đang bị lỗi (Status: $NGINX_STATUS)"
ALERT_TRIGGERED=1
# Tùy chọn: Tự động restart NGINX
# systemctl restart nginx
fi
Giải thích các tùy chọn trong lệnh:
* is-active: Cờ của systemctl trả về chuỗi active nếu dịch vụ đang chạy bình thường, hoặc inactive/failed nếu dịch vụ đã dừng.
* != "active": Toán tử so sánh chuỗi trong Bash, kiểm tra nếu trạng thái khác “active” thì kích hoạt cảnh báo.
Bước 2: Bổ sung logic check Docker Container
Nếu ứng dụng của bạn chạy trong Docker (Docker 24.0+), bạn có thể kiểm tra xem một container cụ thể có đang “Up” hay không. Ví dụ giám sát container tên mysql-db.
# Kiểm tra Docker Container
CONTAINER_NAME="mysql-db"
DOCKER_STATUS=$(docker inspect -f '{{.State.Running}}' $CONTAINER_NAME 2>/dev/null)
if [ "$DOCKER_STATUS" != "true" ]; then
MESSAGE="$MESSAGE%0A- ❌ Container $CONTAINER_NAME đang DOWN!"
ALERT_TRIGGERED=1
fi
Output mẫu trên Telegram khi dịch vụ sập:
🚨 CẢNH BÁO VPS: web-server-01 (192.168.1.50)
- ❌ NGINX đang bị lỗi (Status: failed)
- ❌ Container mysql-db đang DOWN!
💡 Mẹo: Lệnh
docker inspectchạy rất nhanh và tiết kiệm tài nguyên hơn nhiều so với việc dùngdocker ps | grep mysql-db. Cờ2>/dev/nullgiúp ẩn lỗi nếu container hoàn toàn không tồn tại.
Tối ưu Script: Chống Spam tin nhắn Telegram (Cooldown)
Tóm gọn: Nếu VPS quá tải trong 30 phút, việc nhận 30 tin nhắn liên tục mỗi phút sẽ làm bạn bực mình. Cần tạo cơ chế “Lock file” để giới hạn tần suất gửi (cooldown).
Bước 1: Thêm cơ chế Lock File vào Script
Chúng ta sẽ sử dụng thư mục /tmp để lưu một file tạm. Nếu file này được tạo cách đây chưa đủ thời gian cooldown (ví dụ: 15 phút), script sẽ bỏ qua việc gửi tin nhắn mới.
Sửa lại phần cuối của file monitor.sh (phần # Gửi tin nhắn) thành như sau:
# Cấu hình Cooldown (Tính bằng phút)
COOLDOWN=15
LOCK_FILE="/tmp/telegram_alert.lock"
if [ "$ALERT_TRIGGERED" -eq 1 ]; then
# Kiểm tra xem file lock có tồn tại và được sửa đổi trong vòng $COOLDOWN phút hay không
if [ -f "$LOCK_FILE" ] && find "$LOCK_FILE" -mmin -"$COOLDOWN" | grep -q .; then
echo "Cảnh báo đang trong thời gian cooldown. Bỏ qua."
else
# Gửi tin nhắn
curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" \
-d chat_id="$CHAT_ID" \
-d text="$MESSAGE" \
-d parse_mode="HTML" > /dev/null
# Tạo hoặc cập nhật thời gian của file lock
touch "$LOCK_FILE"
fi
fi
Giải thích các tùy chọn trong lệnh:
* -f "$LOCK_FILE": Kiểm tra xem file lock đã tồn tại trên hệ thống chưa.
* find ... -mmin -15: Tìm file có thời gian sửa đổi (modify time) trong vòng 15 phút đổ lại. Dấu trừ - trước số 15 nghĩa là “nhỏ hơn 15 phút”.
* grep -q .: Chế độ im lặng (quiet) của grep. Trả về true nếu find tìm thấy kết quả, false nếu không tìm thấy.
* touch: Lệnh cập nhật timestamp của file hiện tại thành thời gian thực tế, bắt đầu chu kỳ cooldown mới.
💡 Mẹo: Thư mục
/tmptrên Ubuntu thường được mount dưới dạngtmpfs(lưu trên RAM) hoặc sẽ tự động xóa khi khởi động lại VPS. Điều này rất hoàn hảo cho các file lock tạm thời.
Cấu hình Cronjob để tự động chạy Script
Tóm gọn: Bạn cần dùng cron để lên lịch chạy file script monitor.sh định kỳ, thường là mỗi phút một lần.
Bước 1: Cấp quyền thực thi cho Script
Trước khi đưa vào Cronjob, bạn phải đảm bảo script có quyền chạy (execute permission).
sudo chmod +x /opt/scripts/monitor.sh
Kiểm tra chạy thử thủ công để đảm bảo không có lỗi cú pháp:
/opt/scripts/monitor.sh
Bước 2: Thiết lập Crontab
Mở trình soạn thảo crontab của người dùng root. Bạn bắt buộc phải dùng root nếu script có chứa các lệnh yêu cầu đặc quyền như systemctl hoặc docker.
sudo crontab -e
Thêm dòng sau vào cuối file để chạy script mỗi phút:
* * * * * /opt/scripts/monitor.sh > /dev/null 2>&1
Output khi bạn lưu crontab thành công:
crontab: installing new crontab
Giải thích cú pháp Cron:
* * * * * *: Đại diện cho 5 trường thời gian (Phút, Giờ, Ngày trong tháng, Tháng, Ngày trong tuần). 5 dấu sao nghĩa là chạy mỗi phút.
* > /dev/null: Chuyển hướng output chuẩn (stdout) vào hố đen (xóa bỏ), tránh việc cron gửi email rác vào hệ thống nội bộ.
* 2>&1: Chuyển hướng lỗi (stderr) gộp chung vào stdout, đảm bảo mọi lỗi in ra màn hình đều bị xóa bỏ.
Pitfalls & lỗi thường gặp
Dưới đây là các lỗi thực tế bạn rất dễ gặp phải khi triển khai hệ thống monitor qua Telegram và cách xử lý nhanh chóng.
1. Lỗi command not found khi chạy qua Cronjob
Bạn chạy script bằng tay thì gửi tin nhắn bình thường, nhưng đưa vào Cron thì im lìm.
* Nguyên nhân: Môi trường Cronjob rất hạn chế, nó không có đầy đủ biến $PATH như khi bạn SSH vào. Nó không biết lệnh mpstat, docker hay systemctl nằm ở đâu.
* Cách fix: Khai báo biến PATH ở ngay đầu file monitor.sh (ngay dưới dòng #!/bin/bash).
bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
2. Lỗi 400 Bad Request: chat not found từ Telegram
Script chạy báo lỗi 400 và không có tin nhắn nào được gửi.
* Nguyên nhân: Chat ID bị sai, hoặc bạn chưa từng gửi tin nhắn nào cho Bot trước đó. Bot Telegram không thể tự động nhắn tin cho người dùng nếu người dùng chưa bấm /start với nó.
* Cách fix: Mở Telegram, tìm Bot của bạn, bấm Start. Nếu dùng Group, hãy thêm Bot vào Group và gửi một tin nhắn bất kỳ vào Group trước khi lấy Chat ID.
3. Lỗi bc: command not found
Script báo lỗi ở dòng tính toán CPU.
* Nguyên nhân: Hệ điều hành Ubuntu bản Minimal thường không cài sẵn gói tính toán bc.
* Cách fix: Cài đặt bổ sung thông qua apt.
bash
sudo apt install bc -y
4. Tin nhắn Telegram bị vỡ format HTML
Bạn nhận được tin nhắn chứa nguyên các thẻ <b>, %0A chứ không in đậm hay xuống dòng.
* Nguyên nhân: Quên truyền tham số parse_mode="HTML" vào lệnh curl, hoặc dùng sai thẻ HTML (Telegram chỉ hỗ trợ b, i, u, s, code, pre).
* Cách fix: Kiểm tra lại lệnh curl trong script, đảm bảo có cờ -d parse_mode="HTML".
Key takeaways
- Chủ động bảo vệ hệ thống: Monitor VPS bằng Telegram bot khi CPU/disk/RAM cao giúp bạn phát hiện sự cố trước khi người dùng phàn nàn.
- Tận dụng công cụ có sẵn: Kết hợp
bash,cron,awkvà Telegram API tạo ra hệ thống giám sát 0 đồng, không ngốn tài nguyên. - Kiểm soát ngưỡng (Threshold): Thiết lập ngưỡng hợp lý (80-90%) để tránh báo động giả do các đợt tăng tải ngắn hạn.
- Chống Spam là bắt buộc: Luôn sử dụng cơ chế Lock File (
/tmp) để tạo thời gian cooldown, tránh việc Telegram bị đẩy hàng ngàn tin nhắn. - Môi trường Cronjob: Luôn nhớ khai báo biến
$PATHhoặc dùng đường dẫn tuyệt đối (absolute path) cho các lệnh Linux trong script chạy bằng Cron.
FAQ
Có thể dùng script này để monitor nhiều VPS cùng lúc không?
Được. Bạn có thể copy script này lên nhiều VPS khác nhau. Chỉ cần dùng chung 1 Token Bot và Chat ID, các VPS sẽ gửi cảnh báo về cùng một nhóm Telegram. Tên Hostname và IP trong tin nhắn sẽ giúp bạn phân biệt VPS nào đang gặp sự cố.
Làm sao để biết Disk nào đang bị đầy nếu VPS có nhiều ổ cứng?
Trong script hiện tại, lệnh df -h / chỉ check phân vùng root. Nếu bạn mount thêm ổ cứng ở /data, bạn cần thêm dòng lệnh tương tự: DISK_DATA=$(df -h /data | awk 'NR==2{printf "%d", $5}') và thêm logic cảnh báo cho biến này.
Tại sao không dùng Zabbix hay Prometheus thay vì Bash Script?
Zabbix hay Prometheus/Grafana là giải pháp tuyệt vời nhưng chúng cần một VPS riêng để chạy server giám sát, tốn kém chi phí và phức tạp để thiết lập. Bash Script phù hợp cho nhu cầu “Intermediate” – cần nhanh, gọn, nhẹ và hiệu quả tức thì.
Bot Telegram có giới hạn số lượng tin nhắn gửi đi không?
Có. API Telegram giới hạn khoảng 30 tin nhắn mỗi giây trên toàn bộ Bot, và 20 tin nhắn mỗi phút vào cùng một Group. Đó là lý do bạn bắt buộc phải làm bước tạo Cooldown (Lock file) ở trên để không bị Telegram khóa Bot.
Làm sao để theo dõi mức sử dụng RAM chính xác khi Linux dùng RAM làm Cache?
Lệnh free -m chia bộ nhớ thành used, free, buff/cache. Cột available mới là lượng RAM thực sự còn trống để cấp cho ứng dụng mới. Script trong bài dùng công thức tính cơ bản để dễ hiểu. Để chính xác tuyệt đối, bạn nên lấy (Total - Available) / Total.
Cần VPS chạy Monitor VPS bằng Telegram bot khi CPU/disk/RAM cao?
Một hệ thống giám sát tốt cần chạy trên một hạ tầng ổn định. Nếu bạn đang tìm kiếm VPS hiệu năng cao, uptime 99.9% để triển khai các dự án quan trọng và thực hành các script tự động hóa, hãy tham khảo ngay các gói dịch vụ tại VSIS.
👉 Đăng ký ngay tại: vsis.net/vps để trải nghiệm VPS tốc độ cao với giá thành tối ưu nhất!



