本文目录导读:

Linux Shell 脚本
基础版 - 显示磁盘空间使用情况
#!/bin/bash echo "==========================================" echo " 硬盘使用报告 - $(date '+%Y-%m-%d %H:%M:%S')" echo "==========================================" echo "" echo "=== 磁盘分区使用情况 ===" df -h | grep -v "tmpfs\|devtmpfs\|overlay" echo "" echo "=== 磁盘总容量和已用空间 ===" df -h --total | grep "total" echo "" echo "=== inode 使用情况 ===" df -i | grep -v "tmpfs\|devtmpfs\|overlay"
进阶版 - 带阈值警告的详细报告
#!/bin/bash
# 报告文件路径
REPORT_FILE="/tmp/disk_report_$(date +%Y%m%d).txt"
WARNING_THRESHOLD=80 # 警告阈值(百分比)
echo "正在生成硬盘使用报告..."
echo "==========================================" > "$REPORT_FILE"
echo "硬盘使用报告 - 生成时间: $(date)" >> "$REPORT_FILE"
echo "==========================================" >> "$REPORT_FILE"
echo "" >> "$REPORT_FILE"
echo "1. 磁盘分区使用情况:" >> "$REPORT_FILE"
df -h >> "$REPORT_FILE"
echo "" >> "$REPORT_FILE"
echo "2. 磁盘性能统计:" >> "$REPORT_FILE"
if command -v iostat &> /dev/null; then
iostat -x 1 1 >> "$REPORT_FILE"
else
echo "iostat 未安装" >> "$REPORT_FILE"
fi
echo "" >> "$REPORT_FILE"
echo "3. 主要挂载点详情:" >> "$REPORT_FILE"
# 检查主要挂载点
df -h | grep -v "tmpfs\|devtmpfs\|overlay\|loop" | while read line; do
if [[ $line == *"Filesystem"* ]]; then
echo "$line" >> "$REPORT_FILE"
continue
fi
usage=$(echo $line | awk '{print $5}' | sed 's/%//')
mount_point=$(echo $line | awk '{print $6}')
filesystem=$(echo $line | awk '{print $1}')
if [ "$usage" -ge "$WARNING_THRESHOLD" ] 2>/dev/null; then
echo "⚠️ 警告: $mount_point ($filesystem) 使用率 $usage% 超过阈值 $WARNING_THRESHOLD%" >> "$REPORT_FILE"
fi
done
echo "" >> "$REPORT_FILE"
echo "4. 大型目录搜索(超过1GB):" >> "$REPORT_FILE"
find / -type d -maxdepth 3 -exec du -sh {} \; 2>/dev/null | sort -rh | head -20 >> "$REPORT_FILE"
echo "" >> "$REPORT_FILE"
echo "报告已保存至: $REPORT_FILE"
echo "报告文件大小: $(du -h "$REPORT_FILE" | cut -f1)"
# 发送邮件(需配置 sendmail 或 mail 命令)
if command -v mail &> /dev/null; then
mail -s "硬盘使用报告" admin@example.com < "$REPORT_FILE"
echo "报告已发送至 admin@example.com"
fi
Windows PowerShell 脚本
# disk_report.ps1
Write-Host "正在生成硬盘使用报告..." -ForegroundColor Green
$reportDate = Get-Date -Format "yyyyMMdd"
$reportPath = "C:\Reports\DiskReport_$reportDate.html"
# 创建报告目录
if (!(Test-Path "C:\Reports")) {
New-Item -ItemType Directory -Path "C:\Reports" -Force
}
# HTML 报告头部
$htmlHead = @"
<!DOCTYPE html>
<html>
<head>硬盘使用报告</title>
<style>
body { font-family: Arial, sans-serif; margin: 20px; }
h1 { color: #333; border-bottom: 2px solid #4CAF50; }
h2 { color: #666; }
table { border-collapse: collapse; width: 100%; margin: 20px 0; }
th { background-color: #4CAF50; color: white; padding: 12px; text-align: left; }
td { padding: 10px; border-bottom: 1px solid #ddd; }
tr:hover { background-color: #f5f5f5; }
.warning { color: red; font-weight: bold; }
.ok { color: green; }
.summary { background-color: #f9f9f9; padding: 20px; border-radius: 5px; }
</style>
</head>
<body>
<h1>硬盘使用报告</h1>
<p>生成时间: $(Get-Date)</p>
<hr>
"@
# 获取磁盘信息
$disks = Get-WmiObject Win32_LogicalDisk -Filter "DriveType=3" | ForEach-Object {
$used = $_.Size - $_.FreeSpace
$usedPercent = [math]::Round(($used / $_.Size) * 100, 2)
[PSCustomObject]@{
Drive = $_.DeviceID
Total = "{0:N2} GB" -f ($_.Size / 1GB)
Used = "{0:N2} GB" -f ($used / 1GB)
Free = "{0:N2} GB" -f ($_.FreeSpace / 1GB)
UsedPercent = $usedPercent
Status = if ($usedPercent -gt 80) { "⚠️ 警告" } else { "✓ 正常" }
}
}
# 生成 HTML 表格
$tableRows = ""
foreach ($disk in $disks) {
$rowClass = if ($disk.UsedPercent -gt 80) { "warning" } else { "ok" }
$tableRows += @"
<tr class="$rowClass">
<td>$($disk.Drive)</td>
<td>$($disk.Total)</td>
<td>$($disk.Used)</td>
<td>$($disk.Free)</td>
<td>$($disk.UsedPercent)%</td>
<td>$($disk.Status)</td>
</tr>
"@
}
$summary = @"
<div class="summary">
<h2>lt;/h2>
<p>总共磁盘数: $($disks.Count)</p>
<p>警告磁盘数: $(($disks | Where-Object { $_.UsedPercent -gt 80 }).Count)</p>
<p>正常磁盘数: $(($disks | Where-Object { $_.UsedPercent -le 80 }).Count)</p>
<p>总容量: $(($disks | ForEach-Object { [double]($_.Total -replace ' GB','') } | Measure-Object -Sum).Sum.ToString("N2")) GB</p>
</div>
"@
# 完整 HTML 内容
$htmlContent = @"
$htmlHead
<h2>磁盘使用详情</h2>
<table>
<tr>
<th>驱动器</th>
<th>总容量</th>
<th>已用空间</th>
<th>可用空间</th>
<th>使用率</th>
<th>状态</th>
</tr>
$tableRows
</table>
$summary
<h2>建议操作</h2>
<ul>
"@
# 添加建议
$warningDisks = $disks | Where-Object { $_.UsedPercent -gt 80 }
if ($warningDisks.Count -gt 0) {
foreach ($disk in $warningDisks) {
$htmlContent += "<li><strong>$($disk.Drive)</strong>: 使用率 $($disk.UsedPercent)%,建议清理或扩展空间</li>"
}
} else {
$htmlContent += "<li>所有磁盘使用率正常</li>"
}
$htmlContent += @"
</ul>
</body>
</html>
"@
# 保存报告
$htmlContent | Out-File -FilePath $reportPath -Encoding UTF8
Write-Host "报告已生成: $reportPath" -ForegroundColor Green
Write-Host "磁盘使用摘要:" -ForegroundColor Yellow
$disks | Format-Table Drive, UsedPercent, Status -AutoSize
# 打开报告
Start-Process $reportPath
定时任务设置
Linux - crontab
# 每天凌晨1点运行 0 1 * * * /path/to/disk_report.sh # 每小时运行一次 0 * * * * /path/to/disk_report.sh
Windows - 任务计划程序
# 创建定时任务(每天上午9点运行) $action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-File C:\Scripts\disk_report.ps1" $trigger = New-ScheduledTaskTrigger -Daily -At "09:00AM" $principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -LogonType ServiceAccount Register-ScheduledTask -TaskName "DiskReport" -Action $action -Trigger $trigger -Principal $principal
使用说明
-
Linux 脚本:
- 保存为
disk_report.sh - 添加执行权限:
chmod +x disk_report.sh - 运行:
./disk_report.sh
- 保存为
-
Windows PowerShell:
- 以管理员身份运行 PowerShell
- 设置执行策略:
Set-ExecutionPolicy RemoteSigned - 运行:
.\disk_report.ps1
-
自定义配置:
- 修改
WARNING_THRESHOLD变量调整告警阈值 - 修改报告路径和格式
- 可添加邮件发送功能
- 修改
这些脚本可以满足日常硬盘监控需求,你可以根据实际环境进行修改和扩展。