Script kiểm tra website và cảnh báo về Telegram
Script kiểm tra website và cảnh báo về Telegram
Dưới đây là một script shell hoàn chỉnh (check_site_alert.sh) — chạy định kỳ (cron hoặc systemd) — sẽ:
kiểm tra HTTP status của URL,
chỉ gửi alert khi trạng thái thay đổi (UP → DOWN hoặc DOWN → UP),
gửi tin nhắn qua Telegram (Bot API),
ghi log đơn giản.
Sao chép toàn bộ vào file, chỉnh TOKEN, CHAT_ID, URL theo hướng dẫn bên dưới rồi cho chạy bằng cron hoặc systemd.
` #!/usr/bin/env bash
check_site_alert.sh
Kiểm tra website và alert về Telegram khi site không truy cập được.
Cấu hình:
- TOKEN: Telegram bot token (từ BotFather)
- CHAT_ID: Chat ID (người dùng hoặc group) nhận alert
- URL: website cần kiểm tra
- TIMEOUT: timeout curl (giây)
- RETRIES: số lần thử khi fail trước khi báo (giảm false positive)
- STATE_FILE: file lưu trạng thái trước đó (UP / DOWN)
- LOGFILE: file log (optional)
Phù hợp cho cron chạy mỗi 1 phút hoặc tùy theo bạn muốn.
========== CẤU HÌNH ==========#
TOKEN="123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11" # <-- thay bằng token bot của bạn CHAT_ID="987654321" # <-- thay bằng chat id URL="https://example.com" # <-- thay bằng URL cần kiểm tra TIMEOUT=10 # timeout curl RETRIES=2 # thử lại N lần trước khi xác định DOWN STATE_FILE="/var/tmp/check_site_alert.state" # file lưu trạng thái LOGFILE="/var/log/check_site_alert.log" # optional - cần quyền ghi SILENT=false # true để tắt log tới stdout
========== HẾT CẤU HÌNH ==========#
send_telegram() { local text="$1"
Sử dụng curl để gửi message (escape JSON minimal)
curl -s -X POST "https://api.telegram.org/bot${TOKEN}/sendMessage"
-d chat_id="${CHAT_ID}"
-d parse_mode="Markdown"
--data-urlencode "text=${text}" >/dev/null 2>&1
}
log() { local msg="$1" local now now="$(date '+%Y-%m-%d %H:%M:%S')" if [ -n "$LOGFILE" ]; then echo "[$now] $msg" >> "$LOGFILE" 2>/dev/null fi if [ "$SILENT" = false ]; then echo "[$now] $msg" fi }
đảm bảo file trạng thái tồn tại
if [ ! -f "$STATE_FILE" ]; then echo "UNKNOWN" > "$STATE_FILE" fi
hàm kiểm tra 1 lần bằng curl, trả về http code và thời gian (ms)
check_once() {
-s: silent, -S show errors, -m timeout, -o /dev/null: không in nội dung
-w '%{http_code} %{time_total}\n'
curl -s -S -m $TIMEOUT -o /dev/null -w '%{http_code} %{time_total}' "$URL" 2>/dev/null || echo "000 0" }
Thực hiện RETRIES lần; nếu có ít nhất 1 lần thành công với code 2xx/3xx => UP
attempt_ok=false last_http=000 last_time=0 for i in $(seq 1 $RETRIES); do read http_code time_total < <(check_once) last_http="$http_code" last_time="$time_total"
coi 200-399 là up
if [ "$http_code" -ge 200 ] 2>/dev/null && [ "$http_code" -lt 400 ] 2>/dev/null; then attempt_ok=true break fi
nhỏ pause giữa retries
sleep 1 done
if [ "$attempt_ok" = true ]; then current_state="UP" else current_state="DOWN" fi
prev_state="$(cat "$STATE_FILE" 2>/dev/null || echo "UNKNOWN")"
Nếu trạng thái thay đổi hoặc trạng thái trước UNKNOWN thì thông báo
if [ "$current_state" != "$prev_state" ]; then
build message
if [ "$current_state" = "DOWN" ]; then text="🚨 ALERT: Website DOWN\nURL: `$URL`\nHTTP: $last_http\nResponse time: ${last_time}s\nTime: $(date '+%Y-%m-%d %H:%M:%S')" send_telegram "$text" log "ALERT sent: DOWN (http=$last_http, time=${last_time}s)" elif [ "$current_state" = "UP" ]; then text="✅ RECOVERY: Website is UP\nURL: `$URL`\nHTTP: $last_http\nResponse time: ${last_time}s\nTime: $(date '+%Y-%m-%d %H:%M:%S')" send_telegram "$text" log "Recovery message sent: UP (http=$last_http, time=${last_time}s)" else # first-run UNKNOWN -> decide not to send or send initial? chúng ta gửi 1 thông báo trạng thái hiện tại text="ℹ️ Status: $current_state\nURL: `$URL`\nHTTP: $last_http\nTime: $(date '+%Y-%m-%d %H:%M:%S')" send_telegram "$text" log "Initial status: $current_state" fi
cập nhật state file
echo "$current_state" > "$STATE_FILE" else
Không đổi trạng thái -> không gửi, chỉ log
log "No change: $current_state (http=$last_http)" fi
exit 0 `
Hướng dẫn nhanh để chạy#
Tạo bot Telegram và lấy token:
Chat với @BotFather trên Telegram, dùng
/newbot, làm theo hướng dẫn, lấyTOKEN(dạng123456:ABC...).Lấy
CHAT_ID:Mở chat với bot (hoặc thêm bot vào group).
- Gửi 1 tin nhắn cho bot. Sau đó chạy:
curl -s "https://api.telegram.org/bot<YOUR_TOKEN>/getUpdates" | grep -Po '"chat":{"id":\K-?\d+'
Hoặc dùng `curl -s "https://api.telegram.org/bot$TOKEN/getUpdates"` rồi đọc `chat.id` trong JSON trả về. Dùng ID đó cho `CHAT_ID`.
Nếu bot trong group, chat_id có thể là số âm (ví dụ
-1234567890).Lưu script:
` sudo nano /usr/local/bin/check_site_alert.sh
dán nội dung vào, sửa TOKEN, CHAT_ID, URL
sudo chmod +x /usr/local/bin/check_site_alert.sh `
- Chạy thử manual:
/usr/local/bin/check_site_alert.sh
- Thiết lập cron (ví dụ kiểm tra mỗi 1 phút):
`
mở crontab
crontab -e
thêm dòng (chỉnh đường dẫn nếu khác)
*/1 * * * * /usr/local/bin/check_site_alert.sh >> /var/log/check_site_alert.cron.log 2>&1 `
Nâng cao / gợi ý#
Nếu muốn kiểm tra nội dung (ví dụ trang phải chứa chuỗi cụ thể), có thể thay
check_onceđểcurlnội dung vàgrepchuỗi.Nếu site dùng HTTPS với chứng chỉ tự ký — dùng
curl -k(không khuyến khích cho production).Để tránh spam, script chỉ gửi khi trạng thái thay đổi. Nếu muốn gửi nhiều lần khi DOWN, bạn có thể thêm bộ đếm hoặc gửi cứ N lần.
Bạn có thể dùng
systemdtimer thay cho cron nếu muốn quản lý tốt hơn.Nếu muốn cảnh báo richer (photo, buttons), dùng Telegram Bot API method khác như
sendPhotohoặcsendMessagevớireply_markup.
Dưới đây là phiên bản mới của script cho phép kiểm tra nhiều URL cùng lúc, mỗi URL có file trạng thái riêng và gửi cảnh báo về Telegram khi DOWN hoặc khi RECOVERY.
✅ Script: check_multi_sites.sh
Chỉ cần liệt kê danh sách URL vào mảng
SITES.Mỗi URL sẽ có state file riêng dựa trên MD5 của URL.
Cron chạy mỗi phút vẫn OK.
` #!/usr/bin/env bash
check_multi_sites.sh
Kiểm tra nhiều website và gửi cảnh báo về Telegram khi DOWN / RECOVERY
================== CẤU HÌNH ==================#
TOKEN="123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11" # Token bot CHAT_ID="987654321" # Chat ID TIMEOUT=10 # Timeout curl RETRIES=2 # Số lần thử STATE_DIR="/var/tmp/check_sites_states" # Thư mục lưu trạng thái LOGFILE="/var/log/check_multi_sites.log" SILENT=false
👉 Danh sách URL cần kiểm tra
SITES=( "https://example.com" "https://sanbong.vn" "https://dichvubds.com" )
================== HẾT CẤU HÌNH ==================#
send_telegram() {
local text="$1"
curl -s -X POST "https://api.telegram.org/bot${TOKEN}/sendMessage"
-d chat_id="${CHAT_ID}"
-d parse_mode="Markdown"
--data-urlencode "text=${text}" >/dev/null 2>&1
}
log() { local msg="$1" local now="$(date '+%Y-%m-%d %H:%M:%S')" echo "[$now] $msg" >> "$LOGFILE" [ "$SILENT" = false ] && echo "[$now] $msg" }
check_once() { curl -s -S -m $TIMEOUT -o /dev/null -w '%{http_code} %{time_total}' "$1" 2>/dev/null || echo "000 0" }
mkdir -p "$STATE_DIR"
for URL in "${SITES[@]}"; do # tạo tên file trạng thái riêng cho URL STATE_FILE="$STATE_DIR/$(echo -n "$URL" | md5sum | awk '{print $1}').state" [ ! -f "$STATE_FILE" ] && echo "UNKNOWN" > "$STATE_FILE"
attempt_ok=false
last_http=000
last_time=0
for i in $(seq 1 $RETRIES); do
read http_code time_total < <(check_once "$URL")
last_http="$http_code"
last_time="$time_total"
if [ "$http_code" -ge 200 ] && [ "$http_code" -lt 400 ]; then
attempt_ok=true
break
fi
sleep 1
done
current_state=$([ "$attempt_ok" = true ] && echo "UP" || echo "DOWN")
prev_state="$(cat "$STATE_FILE")"
if [ "$current_state" != "$prev_state" ]; then
if [ "$current_state" = "DOWN" ]; then
send_telegram "🚨 *ALERT*: Website *DOWN*\nURL: \`$URL\`\nHTTP: $last_http\nTime: $(date '+%Y-%m-%d %H:%M:%S')"
log "ALERT sent for $URL: DOWN ($last_http)"
else
send_telegram "✅ *RECOVERY*: Website *UP*\nURL: \`$URL\`\nHTTP: $last_http\nTime: $(date '+%Y-%m-%d %H:%M:%S')"
log "RECOVERY sent for $URL: UP ($last_http)"
fi
echo "$current_state" > "$STATE_FILE"
else
log "No change for $URL: $current_state"
fi
done
exit 0 `
📌 Hướng dẫn sử dụng
1️⃣ Lưu script#
sudo nano /usr/local/bin/check_multi_sites.sh
Dán nội dung vào → chỉnh TOKEN, CHAT_ID và danh sách SITES.
sudo chmod +x /usr/local/bin/check_multi_sites.sh
2️⃣ Tạo thư mục state & log#
sudo mkdir -p /var/tmp/check_sites_states sudo touch /var/log/check_multi_sites.log sudo chmod 666 /var/log/check_multi_sites.log
3️⃣ Chạy thử#
/usr/local/bin/check_multi_sites.sh
4️⃣ Thiết lập cron (kiểm tra mỗi 1 phút)#
crontab -e
Thêm:
*/1 * * * * /usr/local/bin/check_multi_sites.sh >> /var/log/check_multi_sites_cron.log 2>&1
Bài liên quan trong #Học Lập Trình
-
Mẹo dùng claude code desktop với dự án lớn
minhdev -
Hướng dẫn cài docker trên ubuntu 24
minhdev -
Hướng dẫn đầy đủ về cách cài và dùng Claude trên PC, kèm các mẹo hay!
minhdev · 💬 1 -
Cách xây dựng API cho CMS bằng Java từ A-Z
minhdev · 💬 1 -
Dể xây dựng phần mềm quản lý tài sản cho 1 doanh nghiệp ta cần làm gì
minhdev