怎样用脚本监控系统资源?

wen 实用脚本 2

本文目录导读:

怎样用脚本监控系统资源?

  1. Linux 系统(Shell/Bash)
  2. Windows 系统(PowerShell)
  3. 跨平台方案(Python)
  4. 进阶:接入告警系统
  5. 建议

要用脚本监控系统资源,最常用的方法是使用 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 -bn1psutil.cpu_percent(interval=1) 会占用少量 CPU,监控频率不需要太高。
  • 使用系统级监控工具:如果只是日常运维,建议直接使用 htopglancesnmon 等现成工具,脚本更适合定制化告警或自动运维。

如果你有具体的操作系统或告警方式需求,可以补充,我可以帮你写更精确的脚本。

抱歉,评论功能暂时关闭!