Giám sát job automation: log, cảnh báo Telegram và số liệu

Một job automation chạy ngon trên VPS cả tuần, rồi bỗng dưng hỏng vì lỗi API, hết quota, hoặc RAM đầy. Nếu không ai để ý, công việc có thể gián đoạn hàng giờ trước khi bạn phát hiện. Hệ thống giám sát job automation không chỉ giúp bạn biết khi nào job chết, mà còn cho thấy xu hướng hiệu năng, phát hiện chậm dần trước khi nó gây hậu quả nghiêm trọng. Bài này mình hướng dẫn cách ghi log có cấu trúc, gửi cảnh báo Telegram khi job fail, và theo dõi thời gian chạy, tất cả đều chạy trên một VPS Linux thông thường, không cần hạ tầng đắt tiền.
Tóm tắt nhanh
- Mỗi job automation nên ghi log với cấu trúc JSON hoặc định dạng cố định: thời gian, trạng thái, thời lượng, thông báo lỗi.
- Gửi cảnh báo Telegram khi job fail dùng bot API: chỉ cần một script `curl` gọi `sendMessage`.
- Theo dõi thời gian chạy trung bình của 5-10 lần gần nhất để phát hiện chậm dần, đó là dấu hiệu đầu tiên của vấn đề.
- Tất cả script ví dụ dưới đây đều chạy được trên Ubuntu 24.04, Debian 12, và các bản Linux phổ biến.
Yêu cầu trước khi bắt đầu
- Một VPS chạy Linux (Ubuntu 24.04 hoặc Debian 12), bạn có thể dùng VPS Linux giá rẻ với 1 vCPU và 2 GB RAM là đủ cho hầu hết các script giám sát đơn giản.
- Quyền sudo hoặc root để cài đặt các gói cần thiết.
- Một bot Telegram và chat ID để nhận cảnh báo.
- Job automation của bạn (ví dụ: script bash, cron job, systemd timer, workflow n8n, hoặc OpenClaw). Bài này lấy ví dụ trên script bash và workflow n8n, nhưng nguyên lý áp dụng cho mọi loại job.
Vì sao giám sát job automation là việc phải làm
Job automation tự động hoá công việc lặp lại: kiểm tra website, đồng bộ dữ liệu, gửi email, tạo báo cáo... Nhưng tự động không có nghĩa là không cần để ý. Một job automation bị treo vì lỗi API có thể khiến bạn mất một batch dữ liệu quan trọng. Một job chạy chậm dần do tài nguyên hao mòn là dấu hiệu cần nâng cấp hoặc tối ưu script. Có hệ thống giám sát job automation cho phép bạn:
- Phát hiện lỗi trong vòng vài phút, không phải vài giờ.
- Theo dõi thời gian chạy để biết khi nào cần can thiệp.
- Thu thập số liệu để tối ưu hóa job hoặc chọn hạ tầng phù hợp hơn (ví dụ: nếu job chạy song song cần nhiều RAM, bạn có thể cần đến VPS OpenClaw với cấu hình tối ưu cho automation).
Bước 1 - Thiết lập log có cấu trúc cho job automation
Log là nguồn thông tin đầu tiên khi có sự cố. Nhưng nếu log không có cấu trúc, bạn sẽ mất thời gian đọc hàng nghìn dòng để tìm lỗi. Giải pháp: ghi log theo định dạng JSON hoặc CVS, mỗi dòng chứa timestamp, trạng thái, thời lượng, và thông báo lỗi.
Ví dụ script bash đơn giản cho một job automation giả định (ví dụ: kiểm tra uptime của một website):
#!/bin/bash
TIMESTAMP=$(date +%Y-%m-%dT%H:%M:%S%z)
JOB_NAME="check_website_uptime"
URL="https://thuevps.vn"
# Khởi tạo biến mặc định
STATUS="success"
DURATION=0
ERROR=""
# Đo thời gian chạy
START=$(date +%s%N)
HTTP_CODE=$(curl -o /dev/null -s -w "%{http_code}" "$URL")
END=$(date +%s%N)
DURATION=$(( (END - START) / 1000000 )) # mili giây
if [ "$HTTP_CODE" -ne 200 ]; then
STATUS="fail"
ERROR="HTTP code: $HTTP_CODE"
fi
# Ghi log JSON
echo "{\"timestamp\":\"$TIMESTAMP\",\"job\":\"$JOB_NAME\",\"status\":\"$STATUS\",\"duration_ms\":$DURATION,\"error\":\"$ERROR\"}" >> /var/log/job_automation.log
Sau đó, bạn có thể dùng `grep` hoặc `jq` để phân tích log. Ví dụ, xem các lần fail gần nhất:
grep '"fail"' /var/log/job_automation.log | tail -n 10
Nếu bạn đã cài jq:
cat /var/log/job_automation.log | jq 'select(.status=="fail") | {timestamp, error}' | tail -n 10
Ưu điểm của log JSON: dễ parse bằng script, dễ import vào hệ thống giám sát (Logstash, Grafana Loki), dễ xem trực tiếp bằng lệnh. Nếu job automation của bạn chạy trong n8n, bạn có thể thêm node "Set" để tạo payload JSON và node "Write File" để ghi log.
Bước 2 - Gửi cảnh báo Telegram khi job fail
Khi job fail, bạn cần biết ngay lập tức. Telegram bot là cách đơn giản, miễn phí và không cần quản lý hạ tầng thêm. Các bước tạo bot và lấy chat ID không có gì phức tạp:
- Mở Telegram, tìm bot BotFather, gửi lệnh
/newbot, đặt tên và nhận token (ví dụ:123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11). - Gửi tin nhắn bất kỳ cho bot vừa tạo.
- Gọi API
https://api.telegram.org/bot<TOKEN>/getUpdatesđể lấy chat ID của cuộc trò chuyện đó.
Sau đó, thêm hàm gửi cảnh báo vào script job của bạn. Ví dụ mở rộng script ở trên:
BOT_TOKEN="123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11"
CHAT_ID="123456789"
send_telegram() {
local MESSAGE="$1"
curl -s -X POST "https://api.telegram.org/bot$BOT_TOKEN/sendMessage" \
-d chat_id="$CHAT_ID" \
-d text="$MESSAGE" > /dev/null 2>&1
}
if [ "$STATUS" == "fail" ]; then
send_telegram "🚨 Job $JOB_NAME fail at $TIMESTAMP. Error: $ERROR"
fi
Nếu job fail vào lúc 3 giờ sáng, bạn sẽ nhận được cảnh báo ngay trên điện thoại. Tin nhắn nên chứa tên job, thời gian và nguyên nhân lỗi để bạn có thể chẩn đoán sơ bộ.
Cảnh báo thông minh hơn: Đừng gửi cảnh báo cho mọi lỗi nhỏ. Ví dụ, nếu job của bạn kiểm tra website và website lỗi 502 do mạng tạm thời, một lần fail chưa chắc đã nghiêm trọng. Bạn có thể thêm counter, chỉ gửi cảnh báo nếu fail 3 lần liên tiếp trong 10 phút.
Bước 3 - Theo dõi thời gian chạy để phát hiện chậm dần
Một job chạy lúc nào cũng success không có nghĩa là nó ổn. Nếu thời gian chạy tăng dần theo ngày, đó là dấu hiệu sớm của vấn đề: dữ liệu tích luỹ làm query chậm hơn, RAM bị rò rỉ, hoặc tài nguyên VPS bị chiếm bởi process khác. Cách đơn giản nhất là ghi lại thời gian chạy (duration) vào log, sau đó tính trung bình động 5-10 lần gần đây và so sánh với ngưỡng.
Script tính trung bình động từ log JSON:
#!/bin/bash
LOG_FILE="/var/log/job_automation.log"
JOB_NAME="check_website_uptime"
THRESHOLD_MS=5000 # cảnh báo nếu chậm hơn 5 giây
# Lấy 5 dòng gần nhất của job này
RECENT=$(grep "\"$JOB_NAME\"" "$LOG_FILE" | grep '"success"' | tail -n 5)
# Tính tổng duration
SUM=0
COUNT=0
while IFS= read -r line; do
DUR=$(echo "$line" | jq '.duration_ms')
SUM=$((SUM + DUR))
COUNT=$((COUNT + 1))
done <<< "$RECENT"
if [ "$COUNT" -gt 0 ]; then
AVG=$((SUM / COUNT))
if [ "$AVG" -gt "$THRESHOLD_MS" ]; then
send_telegram "⚠️ Job $JOB_NAME chậm dần: trung bình $AVG ms (ngưỡng $THRESHOLD_MS ms)"
fi
fi
Bạn chạy script này song song với job automation (ví dụ mỗi 30 phút một lần qua cron). Nếu thấy thời gian chạy trung bình vượt ngưỡng, bạn nhận được cảnh báo trước khi job hoàn toàn hỏng. Ngưỡng nên đặt dựa trên thời gian chạy bình thường * 1.5 hoặc 2.
Bước 4 - Tự động hoá giám sát: cron và systemd timer
Để hệ thống giám sát job automation chạy liên tục, bạn cần đặt lịch kiểm tra. Cách đơn giản nhất là cron job:
# Kiểm tra log fail mỗi 5 phút
*/5 * * * * /usr/local/bin/check_job_fail.sh > /dev/null 2>&1
# Kiểm tra chậm dần mỗi 30 phút
*/30 * * * * /usr/local/bin/check_job_slow.sh > /dev/null 2>&1
Nếu bạn muốn chạy giống như một daemon (chạy lại sau crash, log rõ ràng), hãy dùng systemd timer. Cách tạo timer đã được hướng dẫn trong bài viết quản lý dịch vụ với systemd mà mình đã viết trước đây.
Lưu ý với cron: Nếu script kiểm tra fail gửi nhiều cảnh báo trùng nhau, hãy thêm cơ chế deduplicate, ví dụ, tạo file tạm `/tmp/last_fail_check` ghi timestamp lần cuối gửi cảnh báo, và chỉ gửi lại nếu đã qua ít nhất 10 phút.
Bảng tổng hợp cấu hình giám sát cơ bản
| Thành phần | Công cụ / Script | Tần suất | Ngưỡng cảnh báo |
|---|---|---|---|
| Ghi log | Script bash + JSON | Mỗi lần job chạy | Không có |
| Cảnh báo fail | Curl + Telegram API | Ngay khi job fail | 3 lần fail liên tiếp |
| Theo dõi chậm dần | Script bash + jq | Mỗi 30 phút | Trung bình 5 lần > 1.5x thời gian gốc |
| Kiểm tra timeout | Thêm timeout trong script | Mỗi job | Ví dụ: > 10 phút |
Xử lý lỗi thường gặp
Lỗi 1: Telegram bot không gửi được tin nhắn
Nguyên nhân: token sai, chat ID sai, hoặc server không kết nối được Internet. Kiểm tra bằng cách chạy thủ công lệnh curl với token và chat ID. Đảm bảo VPS của bạn có thể kết nối tới api.telegram.org.
Lỗi 2: Log ghi quá nhiều, đầy ổ cứng
Log JSON văn bản rất nhẹ (vài KB mỗi dòng), nhưng nếu job chạy mỗi phút, sau vài tháng có thể lên vài GB. Thiết lập logrotate cho file log:
/var/log/job_automation.log {
daily
rotate 30
compress
missingok
notifempty
}
Lỗi 3: Script chạy lâu, không kịp timeout
Trong script job, luôn thêm timeout cho các lệnh có thể treo (curl, wget, database query). Ví dụ:
timeout 30 curl -o /dev/null -s -w "%{http_code}" "$URL"
Câu hỏi thường gặp
Tôi có thể dùng hệ thống giám sát này cho job automation chạy trên n8n không?
Có. Bạn có thể dùng node "HTTP Request" trong n8n để gửi cảnh báo Telegram, node "Write File" để ghi log JSON, và node "Loop Over Items" để tính trung bình. Hoặc bạn vẫn có thể dùng script bash bên ngoài để gọi n8n API và giám sát status của workflow.
Có cần GPU hoặc tài nguyên lớn để chạy giám sát không?
Không. Một VPS 1 vCPU, 2 GB RAM là đủ. Toàn bộ script giám sát chỉ tốn vài MB RAM và CPU gần như 0 khi chạy ngắt quãng. Nếu bạn có nhiều job, RAM có thể tăng nhưng vẫn rất thấp, dưới 100 MB cho cả hệ thống.
Làm sao để xem lịch sử cảnh báo?
Telegram bot lưu lịch sử chat. Bạn có thể cuộn lên để xem. Hoặc bạn có thể ghi log cảnh báo ra file riêng (ví dụ: /var/log/job_alert.log) bằng echo kèm timestamp.
Tôi nên lưu log ở đâu?
Mặc định trong /var/log/. Nếu bạn chạy nhiều job, tạo thư mục riêng /var/log/automation/ và mỗi job một file. Đừng lưu trong thư mục home nếu không có backup, khi bạn cài lại OS, log mất hết.
Thời gian chạy tăng dần nhưng job vẫn không fail, có cần can thiệp không?
Có. Đó là dấu hiệu sớm của vấn đề: database đầy, dữ liệu tích luỹ nhiều, hoặc script bị memory leak. Hãy kiểm tra ngay: xem log của job đó, kiểm tra RAM và ổ cứng VPS. Nếu không can thiệp, một ngày nào đó job sẽ timeout và fail.
Có cách nào thay thế Telegram không?
Bạn có thể dùng Slack (webhook), email qua Postfix, hoặc Discord webhook. Nguyên lý giống nhau: HTTP request tới API. Telegram được ưa chuộng vì miễn phí, không cần quản lý server riêng, và notification đẩy đến điện thoại rất nhanh.
Bài viết liên quan
- Lập lịch job automation dài hơi bằng systemd timer
- OpenClaw là gì và chạy trên VPS cần cấu hình bao nhiêu
- Cài OpenClaw trên VPS Ubuntu từ đầu tới lần chạy đầu tiên
- n8n tự host hay n8n cloud, tính điểm hòa vốn


