Giải pháp chống sập Server: Dùng script PowerShell giám sát VPS và bắn cảnh báo Telegram
2 giờ sáng, tiếng chuông điện thoại réo rắt báo hiệu hệ thống production vừa ngừng hoạt động. Bạn lồm cồm bò dậy, mò mẫm login qua một phiên RDP có độ trễ cao, chỉ để phát hiện ra ổ C:\ đã đầy 100% khiến hệ thống ERP phát sinh lỗi liên tục, hoặc process w3wp.exe của IIS đang tiêu thụ toàn bộ phần cứng khiến server mất kết nối. Cảm giác làm người xử lý sự cố thụ động, đụng đâu sửa đó, gõ từng dòng lệnh CMD thủ công để rà soát log có lẽ là nỗi ám ảnh chung của các quản trị viên hệ thống.
Nằm trong chuỗi chiến lược của cẩm nang tự động hóa toàn diện với 10 script PowerShell quản trị VPS Windows Server 2025, kịch bản theo dõi tài nguyên chính là cốt lõi giúp bạn luôn nắm thế chủ động. Bằng cách tự tay thiết kế một script PowerShell giám sát VPS, bạn không chỉ thu thập được chính xác các chỉ số phần cứng theo thời gian thực mà còn có thể thiết lập hệ thống tự động gửi tin nhắn báo động thẳng về ứng dụng Telegram trên điện thoại.
Vậy làm thế nào để trích xuất thông số phần cứng mà không gây nghẽn CPU? Tại sao gọi API Telegram trên Windows Server thỉnh thoảng lại phát sinh lỗi giao thức? Và cấu hình Task Scheduler thế nào để kịch bản chạy ngầm 24/7 mà không gây rò rỉ bộ nhớ (memory leak)? Bạn đã sẵn sàng vứt bỏ những thao tác F5 Task Manager thủ công để biến server của mình thành một hệ thống tự báo cáo chưa?
Server ngừng hoạt động lúc nửa đêm: Nỗi ám ảnh của mọi SysAdmin
Khi tài nguyên cạn kiệt, các triệu chứng của VPS thường không xuất hiện ngay lập tức mà âm ỉ tàn phá hệ thống từ bên trong. Trước khi đi vào giám sát, nếu máy chủ của bạn thường xuyên mất kết nối hoặc khởi động lại không rõ nguyên nhân, bạn nên xem qua các bước chẩn đoán lỗi VPS bị treo hoặc tự reboot.
- Khi ổ cứng (Disk) đầy 100%: Rất nhiều developer lầm tưởng rằng hết không gian lưu trữ thì chỉ đơn giản là không upload được file mới. Thực tế khốc liệt hơn nhiều: khi ổ đĩa hệ thống (thường là ổ C:) không còn dung lượng, các ứng dụng web không thể ghi thêm log, database SQL không thể tạo file temp để xử lý query. Kết quả là website báo lỗi HTTP 500, hệ thống nội bộ phát sinh lỗi vỡ giao diện khó hiểu, và toàn bộ luồng công việc bị đình trệ. Việc bỏ lơ, không giám sát ổ cứng có thể biến một ngày cuối tuần yên tĩnh thành một cuộc khủng hoảng nghiêm trọng vào sáng thứ Hai.
- Khi CPU chạm đỉnh 100%: Tải CPU cao liên tục không chỉ khiến hệ thống nóng lên (nếu bạn quản lý server vật lý) mà còn làm đình trệ mọi luồng xử lý mạng. Giao diện Remote Desktop (RDP) sẽ bị khóa cứng do card đồ họa ảo không đủ tài nguyên render hình ảnh trả về cho bạn. Đáng sợ hơn, CPU 100% bất thường thường là dấu hiệu cảnh báo của các phần mềm độc hại (rogue software, đào tiền mã hóa trái phép) đang hoạt động mất kiểm soát hoặc máy chủ của bạn đang bị dội bom request (DDoS/Brute-force).
- Nếu bạn đang gặp tình trạng này, hãy tham khảo ngay bài viết phân tích nguyên nhân và cách xử lý VPS 100% CPU để có phương án khắc phục triệt để.

Tình trạng VPS treo cứng do CPU đụng trần và cạn kiệt không gian lưu trữ luôn là nỗi ám ảnh thường trực của mọi SysAdmin.
Tại sao dân kỹ thuật chuộng script PowerShell giám sát VPS thay vì tool thứ 3?
Đứng trước bài toán monitoring, có rất nhiều phương pháp giám sát VPS khác nhau (như Zabbix, PRTG…). Tuy nhiên, ở một quy mô hạ tầng nhất định, đoạn code PowerShell tự xây dựng lại là giải pháp tỏ ra vượt trội.
Nhẹ, không cần cài agent
Để dùng các công cụ monitoring bên thứ ba, bạn bắt buộc phải cài thêm agent (tác nhân giám sát) lên từng máy chủ. Bản thân các agent này cũng chạy ngầm và tiêu tốn một lượng RAM, CPU không nhỏ. Với script PowerShell giám sát VPS, bạn tận dụng sức mạnh có sẵn (native) sâu trong nhân Windows Server. Không cài thêm phần mềm, không phình to registry.
Chi phí triển khai bằng 0
Bạn không cần phải đau đầu về bài toán license hay giới hạn số lượng sensor. Chỉ mất một buổi chiều để setup và apply kịch bản này cho toàn bộ cụm server của công ty.
Phạm vi tối ưu cho hạ tầng vừa và nhỏ (10 – 200 Servers)
Kịch bản PowerShell hoạt động hoàn hảo và cực kỳ linh hoạt cho các môi trường có quy mô từ nhỏ đến trung bình.
Lưu ý thực chiến: Nếu hệ thống của bạn vượt ngưỡng 200 server hoặc yêu cầu truy vết theo dòng thời gian, lúc này bạn mới thực sự cần đến các giải pháp Enterprise như PRTG hay Veeam ONE. Bởi điểm yếu duy nhất của script là thiếu đi khả năng tạo Dashboard tập trung và vẽ biểu đồ tương quan lịch sử dài hạn.
Bước 1: Khởi tạo Telegram Bot và lấy API Token + Chat ID
Để hệ thống có thể gửi thông báo cho bạn lúc nửa đêm, chúng ta cần tạo một con Bot trên Telegram làm trung gian gửi cảnh báo.

Quy trình 3 bước thao tác với @BotFather và API getUpdates để trích xuất Chat ID chuẩn xác nhất.
Tương tác với @BotFather để lấy Token
- Mở ứng dụng Telegram, nhập vào ô tìm kiếm @BotFather (chọn tài khoản có tích xanh chính chủ).
- Nhấn nút
Start, sau đó gõ lệnh/newbot. - Nhập tên hiển thị cho bot (Ví dụ: VPS Monitor Alert).
- Nhập username cho bot. Username này BẮT BUỘC phải kết thúc bằng chữ bot (Ví dụ: vps_monitor_alert_bot).
- Thành công! BotFather sẽ trả về một chuỗi HTTP API Token (Dạng như:
63xxxxxx71:AAFoxxxxn0hwA-2TVSxxxNf4c).(Cảnh báo: Tuyệt đối không để lộ Token này lên GitHub hay các diễn đàn public, bất kỳ ai có nó đều có thể điều khiển bot và spam hệ thống của bạn).
Lấy Chat ID qua API getUpdates
Bot đã có, nhưng nó cần biết phải gửi tin nhắn cho ai. Người nhận đó (có thể là bạn hoặc một Group chat của team IT) được định danh bằng một dãy số gọi là Chat ID.
- Bạn tìm tên bot vừa tạo trên Telegram, nhấn
Startvà chat thử một câu bất kỳ (ví dụ: Hello). Nếu bạn muốn cảnh báo gửi vào một Group, hãy add bot vào Group đó và gửi một tin nhắn. - Mở trình duyệt web của bạn lên, dán URL sau vào thanh địa chỉ (nhớ thay
{our_bot_token}bằng Token của bạn, và giữ nguyên chữ bot ở phía trước):https://api.telegram.org/bot{our_bot_token}/getUpdates - Trình duyệt sẽ trả về một đoạn mã JSON. Bạn tìm đến cấu trúc
result[0].message.chat.id. Con số hiện ra ở đó chính là Chat ID của bạn.
[TIPS THỰC CHIẾN] Sửa lỗi API trả về mảng rỗng
{"ok":true,"result":[]}:Rất nhiều SysAdmin khi F5 trình duyệt ở bước trên chỉ nhận được một mảng trống không thay vì chuỗi JSON chứa Chat ID. Nguyên nhân gốc rễ là do Group Telegram đang bật chế độ Privacy hoặc Bot chưa được hệ thống cấp quyền đọc tin nhắn.
Cách fix triệt để: Mở lại cuộc trò chuyện với
@BotFather, gõ lệnh/setprivacy, chọn bot của bạn và đổi trạng thái sang Disable. Sau đó, bạn quay lại Group IT, kick bot ra, add lại từ đầu, gửi 1 tin nhắn bất kỳ và F5 lại link API trên trình duyệt là sẽ thấy Chat ID xuất hiện ngay lập tức!
Bước 2: Trích xuất tài nguyên và so sánh giữa Get-CimInstance với Get-Counter
Đây là phần lõi kỹ thuật của kịch bản. Để lấy thông số CPU, RAM, Disk trên Windows Server, PowerShell cung cấp 2 Cmdlet cực mạnh. Mỗi lệnh có một triết lý hoạt động riêng mà một SysAdmin chuyên nghiệp cần phải nắm vững.
Sử dụng Get-CimInstance (Đọc dữ liệu cảm biến thô WMI)
Lệnh Get-CimInstance (bản nâng cấp hiện đại của Get-WmiObject cũ) cho phép truy vấn trực tiếp xuống lớp phần cứng và hệ điều hành.
- Cách hoạt động: Bạn truy vấn các class như
Win32_OperatingSystem(để tính RAM) hayWin32_LogicalDisk(cho ổ cứng). - Ưu điểm vượt trội: Tối ưu CPU, tiêu thụ RAM cực thấp và KHÔNG gây nghẽn. Lệnh này chạy chớp nhoáng, lấy dữ liệu thô (snapshot) tức thì mà không làm treo cửa sổ dòng lệnh.
- Trick thực chiến với ổ cứng: Khi kiểm tra dung lượng ổ đĩa, bạn bắt buộc phải kẹp thêm filter
DriveType=3. Nếu bỏ sót chi tiết này, script sẽ gom cả dữ liệu của USB cắm ngoài, ổ đĩa CD ảo hay ổ đĩa mạng (Network Mapped Drive) vào để tính toán, gây ra báo động giả (false alarm).
Lệnh chuẩn xác chỉ lấy các ổ cứng vật lý hoặc ảo hóa cục bộ:
Get-CimInstance Win32_LogicalDisk -Filter "DriveType=3"
Sử dụng Get-Counter (Dữ liệu Cooked Data)
Thay vì lấy dữ liệu thô rồi tự chia cộng trừ nhân chia, Get-Counter sẽ hỏi thẳng Performance Monitor của hệ điều hành xem mức sử dụng thực tế đã được xử lý hoàn chỉnh (Cooked Value) đang là bao nhiêu. Lệnh này cực kỳ phù hợp để đo CPU.
- Cách hoạt động: Nó lấy mẫu (sample) lần 1, đợi 1 giây, lấy mẫu lần 2 và tự động nội suy ra phần trăm CPU đang dùng.
- Nhược điểm cần né:
- Do phải đợi giữa 2 lần lấy mẫu, script của bạn sẽ bị delay (độ trễ) ít nhất 1 giây tại dòng lệnh này.
- Nếu máy chủ dùng ngôn ngữ khác (không phải English), tên bộ đếm bị việt hóa/ngôn ngữ hóa sẽ làm lệnh báo lỗi không tìm thấy counter.
- Bắt buộc: Phải luôn đi kèm tham số
-ErrorAction Ignore(hoặcSilentlyContinue). Vì nếu trong 1 giây lấy mẫu đó, tiến trình đột ngột bị đóng hoặc ngưng hoạt động, lệnh sẽ báo lỗi nghiêm trọng và làm crash toàn bộ luồng chạy của script.
Trong bài viết này, để tối ưu nhất, chúng ta kết hợp tốc độ của Get-CimInstance cho RAM/Disk và độ chính xác của Get-Counter cho CPU.
Bước 3: Code hoàn chỉnh cho script PowerShell giám sát VPS
Trước khi copy code, có hai điểm tối ưu đáng giá mà các bài hướng dẫn cơ bản trên mạng thường bỏ qua:

Luồng xử lý thông minh của script powershell giám sát vps: Bóc tách tài nguyên thô qua WMI và ép kết nối TLS 1.2 chống lỗi giao thức.
1. Tại sao BẮT BUỘC ép kết nối TLS 1.2?
Một lỗi kinh điển khiến 90% quản trị viên gặp bế tắc khi chạy script trên Windows Server 2012/2016 là lệnh gọi API bị trả về lỗi Connection Closed. Nguyên nhân là do PowerShell mặc định sử dụng các giao thức cũ (SSL 3.0, TLS 1.0) để gửi web request. Trong khi đó, hệ thống bảo mật của Telegram đã cấm cửa các giao thức này và ép buộc dùng TLS 1.2. Ta phải chèn lệnh ép giao thức ở ngay đầu script.
2. Tối ưu JSON Body cho API Telegram
Khi dùng lệnh Invoke-RestMethod, nhiều người thường truyền trực tiếp biến dạng mảng băm (Hash table) vào tham số -Body. PowerShell sẽ tự động chuyển nó thành chuẩn form-data. Tuy nhiên, API của Telegram hoạt động mượt mà và an toàn nhất với định dạng JSON. Bằng cách dùng lệnh ConvertTo-Json -Compress và ép rõ -ContentType "application/json; charset=utf-8", bạn sẽ tránh được hoàn toàn lỗi vỡ font chữ tiếng Việt và lỗi cấu trúc thẻ HTML khi định dạng tin nhắn.
Dưới đây là mã nguồn Monitor-VPS.ps1 hoàn chỉnh, chuẩn Production-ready. Hãy lưu file này vào thư mục an toàn, ví dụ C:\Scripts\Monitor-VPS.ps1.
<#
.SYNOPSIS
Script powershell giám sát vps - Tự động check CPU/RAM/Disk và gửi thông báo Telegram
Tối ưu hóa: Ép TLS 1.2, Chuẩn hóa JSON Payload, Lọc DriveType=3
#>
# ==========================================
# 1. CẤU HÌNH THÔNG SỐ (Thay đổi tại đây)
# ==========================================
$TelegramToken = "THAY_TOKEN_CUA_BAN_VAO_DAY"
$ChatID = "THAY_CHAT_ID_CUA_BAN_VAO_DAY"
$ThresholdCPU = 90 # Báo động nếu CPU >= 90%
$ThresholdRAM = 90 # Báo động nếu RAM >= 90%
$ThresholdDisk = 10 # Báo động nếu Disk TRỐNG <= 10% (Tức là đã dùng 90%)
$ServerName = $env:COMPUTERNAME
$Alerts = @()
# FIX LỖI KẾT NỐI: Ép PowerShell dùng TLS 1.2 (Bắt buộc cho Telegram API)
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
# ==========================================
# 2. HÀM GỬI TIN NHẮN TELEGRAM (Tối ưu JSON)
# ==========================================
Function Send-TelegramAlert {
param([string]$Message)
$uri = "https://api.telegram.org/bot$TelegramToken/sendMessage"
# Tạo Hash table chứa dữ liệu
$body = @{
chat_id = $ChatID
text = $Message
parse_mode = "HTML"
}
try {
# Convert body sang định dạng JSON nguyên bản và ép ContentType
# Kỹ thuật này giúp tránh lỗi font chữ tiếng Việt hoặc parse_mode HTML bị sai lệch
$jsonBody = $body | ConvertTo-Json -Compress
Invoke-RestMethod -Uri $uri -Method Post -ContentType "application/json; charset=utf-8" -Body $jsonBody -TimeoutSec 10 | Out-Null
} catch {
Write-Warning "Không thể gửi tin nhắn Telegram: $_"
}
}
# ==========================================
# 3. THU THẬP TÀI NGUYÊN (MONITORING)
# ==========================================
# --- Kiểm tra CPU (Dùng Get-Counter với ErrorAction) ---
try {
$cpuSample = Get-Counter '\Processor(_Total)\% Processor Time' -ErrorAction Ignore
$cpuUsage = [math]::Round($cpuSample.CounterSamples.CookedValue, 1)
if ($cpuUsage -ge $ThresholdCPU) {
$Alerts += "🔥 <b>CPU Quá tải:</b> Đang sử dụng $cpuUsage% (Ngưỡng: $ThresholdCPU%)"
}
} catch {
# Bỏ qua âm thầm nếu hệ thống không thu thập được counter tạm thời
}
# --- Kiểm tra RAM (Dùng Get-CimInstance cho tốc độ cao) ---
$osInfo = Get-CimInstance -ClassName Win32_OperatingSystem
$totalRam = $osInfo.TotalVisibleMemorySize
$freeRam = $osInfo.FreePhysicalMemory
$usedRamPercent = [math]::Round((($totalRam - $freeRam) / $totalRam) * 100, 1)
if ($usedRamPercent -ge $ThresholdRAM) {
$Alerts += "🧠 <b>RAM Sắp cạn:</b> Đang sử dụng $usedRamPercent% (Ngưỡng: $ThresholdRAM%)"
}
# --- Kiểm tra Disk (Lọc DriveType=3 chống nhiễu) ---
$disks = Get-CimInstance Win32_LogicalDisk -Filter "DriveType=3"
foreach ($disk in $disks) {
$freePercent = [math]::Round(($disk.FreeSpace / $disk.Size) * 100, 1)
if ($freePercent -le $ThresholdDisk) {
$Alerts += "💾 <b>Ổ đĩa $($disk.DeviceID) Đầy:</b> Chỉ còn $freePercent% trống (Ngưỡng nguy hiểm: <= $ThresholdDisk%)"
}
}
# ==========================================
# 4. KIỂM TRA ĐIỀU KIỆN & GỬI CẢNH BÁO
# ==========================================
if ($Alerts.Count -gt 0) {
$FinalMessage = "<b>🚨 CẢNH BÁO VPS: $ServerName</b>`n`n"
$FinalMessage += ($Alerts -join "`n")
$FinalMessage += "`n`n⏱ <i>Thời gian: $(Get-Date -Format 'dd/MM/yyyy HH:mm:ss')</i>"
Send-TelegramAlert -Message $FinalMessage
}
Bước 4: Đưa script lên Task Scheduler chạy ngầm 24/7
Viết script xong mới chỉ là một nửa chặng đường. Nếu bạn mở cửa sổ PowerShell ISE lên, bọc kịch bản trong một vòng lặp vô hạn while($true) và để đó, chẳng bao lâu sau cơ chế Garbage Collection (thu gom rác) của môi trường console sẽ bị quá tải, sinh ra Memory Leak (rò rỉ RAM). Hậu quả là chính script giám sát lại trở thành thủ phạm làm treo server.
Giải pháp chuẩn kỹ thuật là phải giao quyền kích hoạt định kỳ cho Task Scheduler của Windows.
- Nhấn tổ hợp phím
Win + R, gõtaskschd.mscvà nhấn Enter để mở Task Scheduler. - Bên bảng Actions (cột bên phải), click chọn Create Task… (Lưu ý: KHÔNG dùng Create Basic Task vì nó bị ẩn đi các tùy chọn bảo mật cốt lõi).
- Tại tab General (Bảo mật quyền thực thi):
- Name: Đặt tên dễ nhớ, ví dụ:
VPS_Monitoring_Telegram - Security options: Tích chọn
Run whether user is logged on or not(chạy ngầm kể cả khi bạn đã tắt phiên Remote Desktop) và tích vào ôRun with highest privileges. - User Account: Nhấn nút Change User or Group, gõ chữ
SYSTEMrồi check name. Chạy bằng quyềnNT AUTHORITY\SYSTEMlà chuẩn mực nhất khi giám sát ổ đĩa cục bộ. Bạn sẽ không phải lưu hardcode mật khẩu admin của user vào task, chặn đứng nguy cơ lộ lọt credential.
- Name: Đặt tên dễ nhớ, ví dụ:
- Tại tab Triggers (Thiết lập chu kỳ):
- Nhấn New. Chọn Begin the task: On a schedule.
- Mẹo Start Time: Luôn set Start time ở tương lai (cách thời điểm bạn đang cài đặt khoảng 3-5 phút). Nếu bạn set giờ ở quá khứ, máy tính sẽ hiểu sai và trì hoãn task đến mốc thời gian đó vào ngày hôm sau mới chịu chạy.
- Tích chọn
Repeat task every:Chọn 5 minutes (hoặc 10, 30 phút tùy chiến lược). Tại mục For a duration of, hãy chọn Indefinitely (Vô thời hạn).
- Tại tab Actions (Truyền đối số an toàn):
- Action: Start a program.
- Program/script: Gõ
powershell.exe. - Add arguments (QUAN TRỌNG NHẤT): Nhập chính xác chuỗi sau:
-WindowStyle Hidden -ExecutionPolicy Bypass -NoProfile -File "C:\Scripts\Monitor-VPS.ps1"(Giải thích:-WindowStyle Hiddenngăn chặn việc các cửa sổ đen CMD bật lên chớp nhoáng trên màn hình làm gián đoạn ứng dụng đang chạy.-ExecutionPolicy Bypassgiúp kịch bản vượt qua rào cản cấm chạy script lạ của Windows Server mà không cần phải hạ thấp chuẩn bảo mật của toàn bộ hệ thống).
- Tại tab Settings (Chống kẹt tiến trình / Queue Jam):
- Tích chọn: Run task as soon as possible after a scheduled start is missed.
- Quyết định sống còn: Ở mục dưới cùng (If the task is already running, then the following rule applies), BẮT BUỘC xổ xuống và chọn Stop the existing instance. Tại sao? Nếu API của Telegram bị lag khiến script lượt 1 bị treo chưa tắt được, 5 phút sau script lượt 2 khởi tạo… dần dần nó sẽ tạo thành một hàng đợi vô tận (Queue jam) cạn kiệt tài nguyên. Tùy chọn này đảm bảo Windows sẽ tự động đóng tiến trình cũ bị kẹt trước khi kích hoạt một chu kỳ giám sát mới.
Nhấn OK. Kể từ giây phút này, VPS của bạn đã được trang bị một hệ thống giám sát vô hình chạy ngầm không mệt mỏi.
Nâng cao: Tùy biến script để hệ thống monitoring thông minh hơn
Khi bạn đã nắm vững bộ khung của script PowerShell giám sát VPS, bạn hoàn toàn có thể tinh chỉnh thêm các module để nó thông minh hơn, đáp ứng sát hơn với nhu cầu thực tế của hạ tầng.
Giám sát thêm service cốt lõi và ping network
Không chỉ giám sát phần cứng, bạn có thể thêm các khối lệnh kiểm tra trạng thái dịch vụ. Ví dụ, nếu Web Server IIS crash, CPU có thể đang rất thấp nhưng website thực tế đã ngừng hoạt động.
Bạn có thể chèn thêm đoạn code sau vào phần bóc tách tài nguyên:
$iisService = Get-Service -Name "W3SVC" -ErrorAction SilentlyContinue
if ($iisService -and $iisService.Status -ne 'Running') {
$Alerts += "⚠️ <b>Web Server Lỗi:</b> Service W3SVC (IIS) đang bị ngừng hoạt động!"
}
Tương tự, bạn dùng lệnh Test-Connection 8.8.8.8 -Count 1 -Quiet để ping mạng, nếu trả về $false tức là server đã mất đường truyền ra internet.
Cơ chế chống spam Telegram (Alert Fatigue)
Khi CPU VPS leo lên ngưỡng 95% và duy trì liên tục trong 2 tiếng đồng hồ, nếu Task Scheduler chạy mỗi 5 phút, bot Telegram sẽ nã tin nhắn liên hồi khiến bạn kiệt sức vì bão thông báo (Alert Fatigue).
Để khắc phục, bạn có thể tạo một file log lưu trữ Timestamp (thời điểm) của lần cảnh báo gần nhất. Trong script, hãy kiểm tra: nếu lần cảnh báo cuối cùng cách đây chưa đầy 30 phút, script sẽ bỏ qua không gọi hàm Send-TelegramAlert. Cơ chế này giữ cho không gian làm việc của team IT luôn gọn gàng, cảnh báo đúng trọng tâm.
Câu hỏi thường gặp (FAQ)
1. Chạy đoạn script powershell giám sát vps này có cần cài thêm phần mềm hay module gì không?
Không. Kịch bản sử dụng 100% các lệnh native có sẵn của Windows (Get-CimInstance, Get-Counter) nên không cần cài đặt thêm bất kỳ agent hay module bên thứ ba nào.
2. Cắm script chạy ngầm 24/7 có làm ngốn RAM hay CPU của server không?
Gần như bằng 0. Do được tối ưu chạy định kỳ qua Task Scheduler thay vì dùng vòng lặp while($true) vô hạn, tiến trình này thường ngốn chưa tới 15MB RAM và chạy chớp nhoáng trong 1-2 giây rồi tự tắt để giải phóng bộ nhớ.
3. Tại sao tôi bị lỗi “(401) Unauthorized” hoặc “(403) Forbidden” khi gọi API Telegram?
Sai thông tin xác thực. Hãy kiểm tra lại biến $TelegramToken và $ChatID xem có copy dư khoảng trắng (space) nào không. Đồng thời, đảm bảo bạn không xóa dòng code ép kết nối TLS 1.2 ở đầu script.
4. Làm sao để giảm việc bot spam tin nhắn nếu CPU cứ kẹt ở 95% suốt nhiều giờ?
Chỉnh lại Trigger. Mở Task Scheduler, nhấp đúp vào Task của bạn, chuyển sang tab Triggers, đổi tùy chọn Repeat task every từ 5 phút lên 15 hoặc 30 phút để giảm tần suất cảnh báo (alert fatigue).
5. Script này tương thích với các phiên bản Windows Server nào?
Hầu hết mọi phiên bản hiện hành. Hoạt động mượt mà và ổn định trên nền tảng từ Windows Server 2012 R2 cho đến Windows Server 2025 mới nhất, cũng như các dòng VPS chạy hệ điều hành Windows 10/11 (chỉ yêu cầu có sẵn PowerShell 5.1 trở lên).
Kết luận
Chỉ với vài chục dòng code đơn giản, script PowerShell giám sát VPS đã giúp các quản trị viên loại bỏ hoàn toàn nỗi lo nơm nớp mỗi khi đêm về. Từ việc dùng Get-CimInstance truy xuất WMI thô để giảm overhead phần cứng, thủ thuật ép giao thức TLS 1.2 kết nối API Telegram, định dạng chuẩn JSON chống lỗi, cho đến những tick chọn nhỏ lẻ nhưng mang ý nghĩa sống còn trong Task Scheduler (như Stop existing instance), tất cả kết hợp lại tạo nên một hệ thống tự động hóa hoàn hảo, bền bỉ và không tốn một xu chi phí.
Tuy nhiên, việc giám sát mới chỉ là bước phòng ngự bị động. Để tiếp tục hành trình giải phóng bản thân khỏi các tác vụ thủ công nhàm chán, mời bạn tham khảo cẩm nang tự động hóa toàn diện với 10 script PowerShell quản trị VPS Windows Server 2025 để khám phá thêm kịch bản Service Watchdog tự động phục hồi IIS/SQL hoặc thiết lập cập nhật Hotpatching không downtime.






