本文目录导读:

要用脚本监控系统资源,最常用的方法是使用 Shell 脚本(Linux/macOS)或 PowerShell(Windows),以下是几种常见的监控场景及对应的脚本示例。
Linux 系统(Shell/Bash)
监控 CPU 使用率
#!/bin/bash
# 获取CPU空闲百分比,然后反算使用率
cpu_idle=$(top -bn1 | grep "Cpu(s)" | awk '{print $8}')
cpu_usage=$(echo "100 - $cpu_idle" | bc)
echo "CPU使用率: $cpu_usage%"
监控内存使用率
#!/bin/bash
mem_total=$(free -m | awk '/^Mem:/{print $2}')
mem_used=$(free -m | awk '/^Mem:/{print $3}')
mem_usage=$(echo "scale=2; $mem_used / $mem_total * 100" | bc)
echo "内存使用率: $mem_usage%"
监控磁盘使用率(指定分区)
#!/bin/bash
disk_usage=$(df -h / | awk 'NR==2{print $5}' | sed 's/%//')
echo "磁盘使用率: $disk_usage%"
if [ "$disk_usage" -gt 90 ]; then
echo "警告:磁盘使用率超过90%"
fi
综合监控 + 告警(循环执行)
#!/bin/bash
while true; do
cpu=$(top -bn1 | grep "Cpu(s)" | awk '{print 100 - $8}')
mem=$(free -m | awk '/^Mem:/{printf "%.1f", $3/$2*100}')
disk=$(df -h / | awk 'NR==2{print $5}' | sed 's/%//')
echo "[$(date)] CPU: ${cpu}% | 内存: ${mem}% | 磁盘: ${disk}%"
# 超过阈值发告警(可替换为邮件、钉钉、飞书等)
if (( $(echo "$cpu > 90" | bc -l) )); then
echo "CPU告警" | mail -s "CPU超限" admin@example.com
fi
sleep 60
done
Windows 系统(PowerShell)
监控 CPU 使用率
$cpu = (Get-CimInstance Win32_Processor | Measure-Object -Property LoadPercentage -Average).Average Write-Host "CPU使用率: $cpu%"
监控内存使用率
$os = Get-CimInstance Win32_OperatingSystem $mem_usage = [math]::Round(($os.TotalVisibleMemorySize - $os.FreePhysicalMemory) / $os.TotalVisibleMemorySize * 100, 2) Write-Host "内存使用率: $mem_usage%"
监控磁盘使用率(C 盘)
$disk = Get-CimInstance Win32_LogicalDisk -Filter "DeviceID='C:'" $disk_usage = [math]::Round(($disk.Size - $disk.FreeSpace) / $disk.Size * 100, 2) Write-Host "C盘使用率: $disk_usage%"
循环监控 + 日志记录
while ($true) {
$cpu = (Get-CimInstance Win32_Processor | Measure-Object -Property LoadPercentage -Average).Average
$os = Get-CimInstance Win32_OperatingSystem
$mem = [math]::Round(($os.TotalVisibleMemorySize - $os.FreePhysicalMemory) / $os.TotalVisibleMemorySize * 100, 2)
$disk = Get-CimInstance Win32_LogicalDisk -Filter "DeviceID='C:'"
$disk_usage = [math]::Round(($disk.Size - $disk.FreeSpace) / $disk.Size * 100, 2)
$log = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') | CPU: $cpu% | 内存: $mem% | 磁盘: $disk_usage%"
Write-Host $log
# 写入日志文件
Add-Content -Path "C:\monitor.log" -Value $log
Start-Sleep -Seconds 60
}
跨平台方案(Python)
如果你希望一个脚本在 Linux/Windows/macOS 都能用,Python 是最佳选择:
#!/usr/bin/env python3
import psutil
import time
import datetime
def monitor():
cpu = psutil.cpu_percent(interval=1)
mem = psutil.virtual_memory().percent
disk = psutil.disk_usage('/').percent
now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print(f"[{now}] CPU: {cpu}% | 内存: {mem}% | 磁盘: {disk}%")
# 告警示例
if cpu > 90:
print("⚠️ CPU 超过 90%")
if __name__ == "__main__":
while True:
monitor()
time.sleep(60)
安装依赖:
pip install psutil
进阶:接入告警系统
钉钉机器人通知(Linux)
#!/bin/bash
send_dingtalk() {
curl -s -X POST "https://oapi.dingtalk.com/robot/send?access_token=你的TOKEN" \
-H "Content-Type: application/json" \
-d "{\"msgtype\":\"text\",\"text\":{\"content\":\"$1\"}}"
}
cpu=$(top -bn1 | grep "Cpu(s)" | awk '{print 100 - $8}')
if (( $(echo "$cpu > 90" | bc -l) )); then
send_dingtalk "⚠️ CPU告警: 当前 ${cpu}%"
fi
企业微信机器人(Python)
import requests
import json
def send_wechat(msg, webhook_url):
data = {"msgtype": "text", "text": {"content": msg}}
requests.post(webhook_url, data=json.dumps(data), headers={"Content-Type":"application/json"})
建议
- 不要直接输出原始数据:建议加上时间戳、单位、阈值判断。
- 设置合理的告警阈值:CPU 建议 80~90%,内存 80~90%,磁盘 85~90%。
- 考虑性能开销:
top -bn1或psutil.cpu_percent(interval=1)会占用少量 CPU,监控频率不需要太高。 - 使用系统级监控工具:如果只是日常运维,建议直接使用
htop、glances、nmon等现成工具,脚本更适合定制化告警或自动运维。
如果你有具体的操作系统或告警方式需求,可以补充,我可以帮你写更精确的脚本。