提交 2c4596ea authored 作者: 陈泽健's avatar 陈泽健

fix(服务自检): 修复资源检测日志乱码并产出问题处理/计划执行文档

- ServerResourceAnalysis.psm1 第 8/9/10/11 节(inode 使用率/只读挂载/TCP 状态分布/僵尸进程/TOP5 进程)24 处乱码中文按行号精确重建,文案对齐 sh 版 check_server_health.sh 与 Report.psm1
- DNSCheck.psm1 文件尾"导出模块函数"注释乱码修复(此前会话改过工作区未提交)
- 根因:UTF-8 中文被误按 GBK 解码后"烘焙"进源码(含 U+FFFD 不可逆,字节级自动复原有损)
- 验证:PowerShell 解析器 err=0、字节级全量乱码审计 25 处→0、桌面 SHA256/diff 一致
- 新增问题处理 + 计划执行双文档(Docs/PRD/服务自检/问题修复/)
- HANDOFF 更新:表格 #28-32、验证结果块、阻塞行、下一步 #9-10、踩坑警示 #10、给接手者
Co-Authored-By: 's avatarClaude <noreply@anthropic.com>
上级 5c4da5de
......@@ -292,7 +292,7 @@ function Test-DNSResolution {
#endregion
# ==============================================================================
# 瀵煎嚭妯″潡鍑芥暟
# 导出模块函数
# ==============================================================================
Export-ModuleMember -Function @(
'Test-DNSResolution'
......
......@@ -891,9 +891,9 @@ printf "%d,%d,%d\n" "$tot_gb" "$use_gb" "$pct"
#region 8. inode 浣跨敤鐜囨��娴� (PRD 2.5)
#region 8. inode 使用率检测 (PRD 2.5)
Write-Log -Level "INFO" -Message "妫�娴� inode 浣跨敤鐜�..."
Write-Log -Level "INFO" -Message "检测 inode 使用率..."
$inodeCmd = "df -i | grep -E '^/dev/' | awk '{print `$1,`$2,`$3,`$4,`$5,`$6}'"
......@@ -927,7 +927,7 @@ printf "%d,%d,%d\n" "$tot_gb" "$use_gb" "$pct"
# 杩囨护 tmpfs/overlay 绛夎櫄鎷熸枃浠剁郴缁�
# 过滤 tmpfs/overlay 等虚拟文件系统
if ($device -match 'tmpfs|overlay') { continue }
......@@ -937,7 +937,7 @@ printf "%d,%d,%d\n" "$tot_gb" "$use_gb" "$pct"
$inodeStatus = if ($iPercentNum -lt 70) { "姝e父" } elseif ($iPercentNum -lt 90) { "璀﹀憡" } else { "寮傚父" }
$inodeStatus = if ($iPercentNum -lt 70) { "正常" } elseif ($iPercentNum -lt 90) { "警告" } else { "异常" }
$inodeColor = if ($iPercentNum -lt 70) { "SUCCESS" } elseif ($iPercentNum -lt 90) { "WARN" } else { "ERROR" }
......@@ -971,13 +971,13 @@ printf "%d,%d,%d\n" "$tot_gb" "$use_gb" "$pct"
#endregion 8. inode 浣跨敤鐜囨��娴�
#endregion 8. inode 使用率检测
#region 9. 鍙�璇绘寕杞芥��娴� (PRD 2.5)
#region 9. 只读挂载检测 (PRD 2.5)
Write-Log -Level "INFO" -Message "妫�娴嬪彧璇绘寕杞�..."
Write-Log -Level "INFO" -Message "检测只读挂载..."
$roCmd = "mount | grep ' ro[, ]' | grep -vE 'proc|sys|dev|cgroup|tmpfs' || echo 'NO_RO'"
......@@ -993,7 +993,7 @@ printf "%d,%d,%d\n" "$tot_gb" "$use_gb" "$pct"
if ($roOutput -match 'NO_RO') {
Write-Log -Level "SUCCESS" -Message " 鏃犳剰澶栧彧璇绘寕杞�"
Write-Log -Level "SUCCESS" -Message " 无意外只读挂载"
} else {
......@@ -1001,7 +1001,7 @@ printf "%d,%d,%d\n" "$tot_gb" "$use_gb" "$pct"
foreach ($line in $roLines) {
Write-Log -Level "WARN" -Message " 鍙戠幇鍙�璇绘寕杞�: $line"
Write-Log -Level "WARN" -Message " 发现只读挂载: $line"
$roList += $line
......@@ -1015,13 +1015,13 @@ printf "%d,%d,%d\n" "$tot_gb" "$use_gb" "$pct"
#endregion 9. 鍙�璇绘寕杞芥��娴�
#endregion 9. 只读挂载检测
#region 10. TCP 鐘舵�佸垎甯冩��娴� (PRD 2.5)
#region 10. TCP 状态分布检测 (PRD 2.5)
Write-Log -Level "INFO" -Message "妫�娴� TCP 鐘舵�佸垎甯�..."
Write-Log -Level "INFO" -Message "检测 TCP 状态分布..."
$tcpCmd = "netstat -ant 2>/dev/null | awk '{print `$6}' | sort | uniq -c | sort -rn"
......@@ -1051,7 +1051,7 @@ printf "%d,%d,%d\n" "$tot_gb" "$use_gb" "$pct"
# 妫�鏌ュ紓甯哥姸鎬�
# 检查异常状态
$closeWait = if ($tcpStatus['CLOSE_WAIT']) { $tcpStatus['CLOSE_WAIT'] } else { 0 }
......@@ -1067,11 +1067,11 @@ printf "%d,%d,%d\n" "$tot_gb" "$use_gb" "$pct"
if ($tcpWarning) {
Write-Log -Level "WARN" -Message " TCP鐘舵�佸紓甯�: $tcpWarning"
Write-Log -Level "WARN" -Message " TCP状态异常: $tcpWarning"
} else {
Write-Log -Level "SUCCESS" -Message " TCP鐘舵�佹�e父: CLOSE_WAIT=$closeWait TIME_WAIT=$timeWait"
Write-Log -Level "SUCCESS" -Message " TCP状态正常: CLOSE_WAIT=$closeWait TIME_WAIT=$timeWait"
}
......@@ -1081,13 +1081,13 @@ printf "%d,%d,%d\n" "$tot_gb" "$use_gb" "$pct"
#endregion 10. TCP 鐘舵�佸垎甯冩��娴�
#endregion 10. TCP 状态分布检测
#region 11. 鍍靛案杩涚▼鍜� TOP5 妫�娴� (PRD 2.5)
#region 11. 僵尸进程和 TOP5 检测 (PRD 2.5)
Write-Log -Level "INFO" -Message "妫�娴嬪兊灏歌繘绋�..."
Write-Log -Level "INFO" -Message "检测僵尸进程..."
$zombieCmd = "ps aux | awk '`$8~/Z/' | grep -v grep || echo 'NO_ZOMBIE'"
......@@ -1105,7 +1105,7 @@ printf "%d,%d,%d\n" "$tot_gb" "$use_gb" "$pct"
if ($zOutput -match 'NO_ZOMBIE') {
Write-Log -Level "SUCCESS" -Message " 鏃犲兊灏歌繘绋�"
Write-Log -Level "SUCCESS" -Message " 无僵尸进程"
} else {
......@@ -1113,7 +1113,7 @@ printf "%d,%d,%d\n" "$tot_gb" "$use_gb" "$pct"
$zombieCount = $zLines.Count
Write-Log -Level "WARN" -Message " 鍙戠幇 $zombieCount 涓�鍍靛案杩涚▼"
Write-Log -Level "WARN" -Message " 发现 $zombieCount 个僵尸进程"
$zombieList = $zLines
......@@ -1125,9 +1125,9 @@ printf "%d,%d,%d\n" "$tot_gb" "$use_gb" "$pct"
# TOP5 杩涚▼锛堟寜鍐呭瓨鍜孋PU锛�
# TOP5 进程(按内存和CPU)
Write-Log -Level "INFO" -Message "鑾峰彇 TOP5 杩涚▼..."
Write-Log -Level "INFO" -Message "获取 TOP5 进程..."
$topCmd = "ps aux --sort=-%mem | head -n 6 | awk '{print `$1,`$2,`$3,`$4,`$11}'"
......@@ -1147,7 +1147,7 @@ printf "%d,%d,%d\n" "$tot_gb" "$use_gb" "$pct"
}
Write-Log -Level "INFO" -Message " TOP5杩涚▼锛堟寜鍐呭瓨锛�:"
Write-Log -Level "INFO" -Message " TOP5进程(按内存):"
foreach ($p in $topProcesses | Select-Object -Skip 1) {
......@@ -1161,7 +1161,7 @@ printf "%d,%d,%d\n" "$tot_gb" "$use_gb" "$pct"
#endregion 11. 鍍靛案杩涚▼鍜� TOP5 妫�娴�
#endregion 11. 僵尸进程和 TOP5 检测
......@@ -1177,7 +1177,7 @@ printf "%d,%d,%d\n" "$tot_gb" "$use_gb" "$pct"
# ==============================================================================
# 瀵煎嚭妯″潡鍑芥暟
# 导出模块函数
# ==============================================================================
......
......@@ -2,7 +2,7 @@
> **生成时间**:2026-08-25
> **会话主题**:服务自检脚本自动修复全面禁用 + 模块导入作用域修复 + 加载警告抑制
> **最近更新**:2026-09-01(桌面同步补全 7 个漏同步文件 + HANDOFF 踩坑警示补充,待提交)
> **最近更新**:2026-09-01(资源检测日志乱码修复:ServerResourceAnalysis.psm1 第 8/9/10/11 节 24 处 + DNSCheck.psm1 尾部 1 处乱码重建,问题处理+计划执行文档产出,桌面同步,待提交)
---
......@@ -48,6 +48,11 @@
| 25 | 桌面同步补全(漏同步 7 文件) | `C:\Users\29194\Desktop\Sever_health_check\` | 2026-09-01 复核:上次仅同步主脚本,漏了 ConfigIPCheck/DataBackup/FilePermission/LogExport/Report/ShellAdapter.psm1 + `lib/shell/config_check.sh` 共 7 个文件(桌面停留在旧版);已从仓库最新版拷贝同步,`diff -rq` 全量校验 0 差异 |
| 26 | 桌面同步范围确认 - md 文档不放置 | `C:\Users\29194\Desktop\Sever_health_check\` | 2026-09-01 确认:方案/需求类 md 文档(如 `PowerShell模块修复项确认改进方案.md`、`修复项确认交互改进方案.md`)**不放入桌面测试目录**,仅保留在仓库 Docs 中;桌面目录只放运行脚本 + 模块 + 运行时产物 |
| 27 | 踩坑警示补充 #8 | `Docs/PRD/服务自检/HANDOFF_服务自检会话交接.md` | 【待提交】新增警示:桌面同步必须覆盖 modules/ 全部模块与 lib/,不能只同步主脚本;同步后需全量 `diff -rq` 校验 |
| 28 | 资源检测日志乱码修复 | `modules/ServerResourceAnalysis.psm1` | 【待提交】第 8/9/10/11 节(inode 使用率/只读挂载/TCP 状态分布/僵尸进程/TOP5 进程)24 处乱码中文按行号精确重建为正确文案(对齐 sh 版 `check_server_health.sh` 与 `Report.psm1`);根因 = UTF-8 中文被误按 GBK 解码后"烘焙"进源码(含 U+FFFD,字节级自动复原有损) |
| 29 | 模块尾部导出注释乱码修复 | `modules/DNSCheck.psm1` | 【待提交】文件尾 `# 瀵煎嚭妯″潡鍑芥暟` → `# 导出模块函数`(1 处)。此前会话曾改过工作区文件但**未提交**(git diff 证明 HEAD 仍是乱码),本次纳入提交推送 |
| 30 | 乱码全量审计脚本(防复发工具) | 临时脚本(已用即删) | 字节级审计:BOM + 严格 UTF-8 + GBK/UTF-8 双编码检索关键中文,扫描 `modules/` 全部 `.psm1/.ps1`;修复前 25 处乱码 → 修复后清零(MiddlewareCheck.psm1 第 227 行经字节级复核为正常汉字"父",误报排除) |
| 31 | 资源检测日志乱码 - 问题处理文档 | `Docs/PRD/服务自检/问题修复/_PRD_资源检测日志乱码_问题处理.md` | 【待提交】2026-09-01 创建:根因(源码烘焙乱码)+ 字节级证据 + 修复对照表 + 预防措施(编码规范/改码铁律/文案对齐/工具化审计) |
| 32 | 资源检测日志乱码 - 计划执行文档 | `Docs/PRD/服务自检/问题修复/_PRD_资源检测日志乱码_问题处理_计划执行.md` | 【待提交】2026-09-01 创建:执行步骤全 [x]、已修复内容表、附录关键代码位置(行号级修复前后对照) |
### 验证结果
......@@ -112,6 +117,20 @@ grep fix_external_service_disconnect 残留: 无(仅 ps1 历史交互文案,
# 同步后全量 diff -rq 校验:✅ 主脚本 3 + modules/16 + lib/ 全部 0 差异
```
### 【2026-09-01 资源检测日志乱码修复】验证结果
```
# PowerShell 解析器语法校验(PS 5.1 powershell.exe)
ServerResourceAnalysis.psm1: err=0 DNSCheck.psm1: err=0 MiddlewareCheck.psm1: err=0
# 字节级乱码全量审计(BOM + 严格 UTF-8 + GBK/UTF-8 双编码检索关键中文)
修复前 25 处乱码点 → 修复后全部清零
(仅剩 MiddlewareCheck.psm1 第 227 行"父"字为正常汉字误报,字节级复核排除)
# 桌面同步复核
修复文件已同步 C:\Users\29194\Desktop\Sever_health_check\modules\,SHA256 与仓库一致,diff -rq 无差异
# 文案对齐
ServerResourceAnalysis.psm1 第 8/9/10/11 节中文已对齐 sh 版 check_server_health.sh 与 Report.psm1(#region / Write-Log 消息 / 状态串 / 注释)
```
---
## 当前阻塞项
......@@ -130,6 +149,8 @@ grep fix_external_service_disconnect 残留: 无(仅 ps1 历史交互文案,
**2026-09-01 桌面同步补全**:复核发现桌面漏同步 7 个文件(上次仅同步主脚本,modules/lib 层停留在旧版),已全部从仓库最新版拷贝并 `diff -rq` 全量校验一致;随后确认方案/需求类 md 文档不放置于桌面测试目录(已移除误拷的 2 个 md),桌面目录仅保留运行脚本 + 模块 + lib + 运行产物。HANDOFF 已记录(表格 #25-27 + 踩坑警示 #8-9),**本次 HANDOFF 变更待提交**。
**2026-09-01 资源检测日志乱码修复**:根因定位为源码烘焙乱码(UTF-8 中文被误按 GBK 解码后又以 UTF-8 存回,含 U+FFFD 不可逆),非显示/传输层问题;ServerResourceAnalysis.psm1 第 8/9/10/11 节 24 处 + DNSCheck.psm1 尾部 1 处按行号精确重建为正确中文(对齐 sh 版与 Report.psm1),Parser err=0、全量审计清零、桌面 SHA256 一致。已产出问题处理 + 计划执行双文档(表格 #28-32),**本次变更待提交**。
---
## 下一步计划
......@@ -144,6 +165,8 @@ grep fix_external_service_disconnect 残留: 无(仅 ps1 历史交互文案,
| 6 | 【2026-08-31】统一平台分类路径细分(redis 日志路径 / extapi 路径过滤 / 报告文案 / 禁用遗漏修复) | ✅ 已完成,commit `9d111845`(代码 11 文件)+ `9be5c892`(HANDOFF)已推送 develop 分支;语法验证(bash -n + PS 解析)、桌面同步 diff 校验均通过 |
| 7 | (可选)在传统统一平台服务器上实测脚本 | 验证 unified 细分路径(redis `/var/www/java/redis`、extapi `/var/www/java/unifiedPlatform/external-meeting-api`)在真实环境生效 |
| 8 | 【2026-09-01】统一平台分类路径细分 HANDOFF 会话闭环提交推送 | ✅ 已完成,commit `71bbf9c3` 已推送 develop 分支,任务 #1-#6 全部 completed |
| 9 | 【2026-09-01】桌面同步补全 + md 文档不放置桌面约定 HANDOFF 记录 | ✅ 已完成(表格 #25-27 + 踩坑警示 #8-9),同步后全量 `diff -rq` 0 差异;**待提交** |
| 10 | 【2026-09-01】资源检测日志乱码修复闭环(代码 + 双文档 + HANDOFF) | ✅ 已完成:ServerResourceAnalysis.psm1 24 处 + DNSCheck.psm1 1 处重建,Parser err=0,审计清零,问题处理+计划执行双文档产出;**待提交** |
---
......@@ -158,6 +181,7 @@ grep fix_external_service_disconnect 残留: 无(仅 ps1 历史交互文案,
7. ❌ **不要把服务器明文密码写回脚本** — 本次已删除 `$ServerList` 中 6 台服务器的明文密码。后续如需"预设列表"功能,应迁移到独立配置文件(JSON),且配置文件不要提交到仓库。
8. ❌ **桌面同步必须覆盖 modules/ 全部模块与 lib/,不能只同步主脚本** — 2026-09-01 复核发现上次只同步了 sh/auto/ps1/ServiceCheck.psm1 四个脚本,**漏了 7 个文件**(ConfigIPCheck/DataBackup/FilePermission/LogExport/Report/ShellAdapter.psm1 + `lib/shell/config_check.sh`),桌面长时间停留在旧版。同步后务必对整个 `ServiceSelfInspection\` 目录执行 `diff -rq` 全量校验,确认 0 差异才算完成。
9.**方案/需求类 md 文档不要同步到桌面测试目录** — 2026-09-01 曾误将 `PowerShell模块修复项确认改进方案.md``修复项确认交互改进方案.md` 拷入桌面后按用户要求删除。桌面目录 `C:\Users\29194\Desktop\Sever_health_check\` 只放运行脚本 + 模块 + lib;md 文档仅保留在仓库 Docs 中。全量 diff 校验时这两类文件属预期差异,不算漏同步。
10. ❌ **中文乱码"烘焙"进源码文件 = 有损不可逆,只能手工重建** — 2026-09-01 资源检测日志乱码:UTF-8 中文被误按 GBK 解码后**以乱码形式写回文件**(仍是合法 UTF-8,编辑器不报编码错,所以"改终端编码/换编码查看"都无效)。含 U+FFFD 替换字符时字节级自动复原有损,必须按行号手工重建正确中文。**改码铁律**:任何批量"转码/改编码"操作前后用字节级校验(BOM + 严格 UTF-8 + GBK/UTF-8 双编码检索关键中文),确认目标中文确实可检索到,防止"转了个寂寞"。PS 模块中文文案新增/修改后同样校验。
---
......@@ -176,6 +200,8 @@ grep fix_external_service_disconnect 残留: 无(仅 ps1 历史交互文案,
| Auto 脚本计划执行文档 | `Docs/PRD/服务自检/新需求/_PRD_服务自检_Auto脚本修复项确认交互_计划执行.md` | v2.0 完全禁用方案 |
| 取消预设选择需求文档 | `Docs/PRD/服务自检/新需求/_PRD_服务自检_取消预设服务器选择默认手动输入_需求文档.md` | 2026-08-31 创建,已实施,回归验收全部 [x] |
| 取消预设选择计划执行文档 | `Docs/PRD/服务自检/新需求/_PRD_服务自检_取消预设服务器选择默认手动输入_计划执行.md` | 2026-08-31 创建,已实施,交互/回归测试全部 ✅ 已验证 |
| 资源检测日志乱码 - 问题处理文档 | `Docs/PRD/服务自检/问题修复/_PRD_资源检测日志乱码_问题处理.md` | 2026-09-01 创建:根因(源码烘焙乱码)+ 字节级证据 + 修复对照表 + 预防措施 |
| 资源检测日志乱码 - 计划执行文档 | `Docs/PRD/服务自检/问题修复/_PRD_资源检测日志乱码_问题处理_计划执行.md` | 2026-09-01 创建:执行步骤全 [x] + 行号级修复前后对照表 |
| 桌面测试目录 | `C:\Users\29194\Desktop\Sever_health_check\` | **用户实际运行环境**(注意:不是 `Desktop\Test\`) |
| 相关提交 | `71bbf9c3`(HANDOFF 会话闭环详情)/ `9d111845`(统一平台分类路径细分代码 11 文件)/ `9be5c892`(HANDOFF 细分闭环)/ `d8a2ef45` / `9896ecc0` / `dd7b3bc5` / `87f96484` / `1bdf43f4` / `1e9acc44` | develop 分支,均已推送 |
......@@ -203,4 +229,12 @@ grep fix_external_service_disconnect 残留: 无(仅 ps1 历史交互文案,
>
> **2026-09-01 会话收尾**:统一平台分类路径细分 HANDOFF 详情已提交推送(`71bbf9c3`),任务 #1-#6 全部标记完成,服务自检工作流(禁用自动修复 → 作用域修复 → 取消预设 → 分类路径细分)阶段闭环。
>
> **2026-09-01 桌面同步补全 + 资源检测日志乱码修复(待提交)**:
>
> - 桌面同步补全:复核发现漏同步 7 个文件(ConfigIPCheck/DataBackup/FilePermission/LogExport/Report/ShellAdapter.psm1 + `lib/shell/config_check.sh`),已全量拷贝同步 + `diff -rq` 0 差异;确认 md 文档不放置桌面
> - 资源检测日志乱码:根因 = UTF-8 中文被误按 GBK 解码后"烘焙"进 `ServerResourceAnalysis.psm1`(第 8/9/10/11 节 24 处)+ `DNSCheck.psm1` 尾部 1 处,按行号精确重建正确中文(对齐 sh 版与 Report.psm1)
> - 验证:Parser err=0 全模块、字节级乱码审计 25 处→0、桌面 SHA256/diff 一致
> - 文档:问题处理 + 计划执行双文档产出(`Docs/PRD/服务自检/问题修复/`)
> - 本次变更(代码 2 文件 + 双文档 + HANDOFF)**待提交推送**
>
> 后续如需继续服务自检相关工作,先 `Read` 本交接文档与本目录下的 PRD 问题处理文档;磁盘上的桌面测试目录是用户实际验证环境(`C:\Users\29194\Desktop\Sever_health_check\`),改代码务必同步两处。
\ No newline at end of file
# _PRD_资源检测日志乱码_问题处理
> 来源:
- `AuxiliaryTool/ScriptTool/ServiceSelfInspection/modules/ServerResourceAnalysis.psm1`
- `AuxiliaryTool/ScriptTool/ServiceSelfInspection/modules/DNSCheck.psm1`
## 1. 背景与目标
### 1.1 背景
执行主运行脚本后,资源检测(inode 使用率、只读挂载、TCP 状态分布、僵尸进程、TOP5 进程)日志输出存在中文乱码,例如:
```
[INFO] 妫�娴� inode 浣跨敤鐜�...
[INFO] 妫�娴� TCP 鐘舵�佸垎甯�...
[SUCCESS] 鏃犳剰澶栧彧璇绘寕杞�
[SUCCESS] 鏃犲兊灏歌繘绋�
```
### 1.2 目标
彻底消除资源检测日志中的中文乱码,恢复正确的检测提示文案;同时修复同批次产生的其他模块注释乱码。
---
## 2. 问题报错信息
### 2.1 问题一:inode / TCP / 僵尸进程 / TOP5 检测日志乱码
```
[INFO] 妫�娴� inode 浣跨敤鐜�...
[WARN] 鍙戠幇鍙�璇绘寕杞�: xxx
[INFO] 妫�娴� TCP 鐘舵�佸垎甯�...
[SUCCESS] TCP鐘舵�佹�e父: CLOSE_WAIT=0 TIME_WAIT=10
[INFO] 妫�娴嬪兊灏歌繘绋�...
[SUCCESS] 鏃犲兊灏歌繘绋�
[INFO] 鑾峰彇 TOP5 杩涚▼...
```
### 2.2 问题二:模块文件末尾导出注释乱码
```
# 瀵煎嚭妯″潡鍑芥暟
```
---
## 3. 问题解决分析
### 3.1 问题根因
#### 根因:UTF-8 中文被误按 GBK 解码后再次以 UTF-8 存回,乱码已"烘焙"进源码文件
排查过程(按照排查六步法):
1. **固化现象**:乱码只出现在资源检测(第 8/9/10/11 节)相关日志与模块尾部注释;Shell 版本脚本(`check_server_health.sh`)输出正常。
2. **切分排查域**
- 终端/显示编码?—— 同一终端下部分中文正常(如"检测系统负载"),排除显示层。
- 传输层(SSH/控制台)?—— 正常与乱码混在同一份输出里,排除传输层。
- **源码文件本身**?—— 命中。
3. **最小验证(字节级探测)**
- `ServerResourceAnalysis.psm1`:UTF-8 with BOM,严格 UTF-8 解码**通过**(所以编辑器不报编码错误);
- 正确的"检测系统负载"(第 7 节)以 UTF-8/GBK 字节形式均能找到(正常中文);
- 但"检测 inode 使用率 / 检测只读挂载 / 检测 TCP 状态分布 / 检测僵尸进程 / 获取 TOP5 进程"等**正确中文在两种编码下均找不到**,而"姝e父 / 璀﹀憡 / 寮傚父"等乱码字以 UTF-8 字节存在。
4. **定位根因**:这些中文曾以 UTF-8 字节被 GBK 解码成乱码,乱码字符又以 UTF-8 重新存回源码。该过程产生不可逆的 U+FFFD 替换字符,导致**字节级自动复原有损**(按 GBK 反编码回滚在遇到 U+FFFD 处直接失败)。
5. **影响范围全量审计**:编写字节级审计脚本扫描 `modules/` 全部 `.psm1/.ps1`,确认乱码点共 25 处:
- `ServerResourceAnalysis.psm1`:第 8/9/10/11 节(24 处,覆盖 `#region``Write-Log` 消息、状态串、注释);
- `DNSCheck.psm1`:文件尾"导出模块函数"注释(1 处);
- `MiddlewareCheck.psm1` 第 227 行命中为**误报**(该行含正常汉字"父",非乱码)。
> 结论:乱码不是显示/传输问题,而是**乱码文本被写进了源码文件本身**。这也解释了为何"改了编码、换了终端"都无法消除。
### 3.2 涉及文件
| 文件 | 位置 | 状态 |
|------|------|------|
| ServerResourceAnalysis.psm1 | modules/ServerResourceAnalysis.psm1 | 已修复(24 处) |
| DNSCheck.psm1 | modules/DNSCheck.psm1 | 已修复(1 处) |
### 3.3 代码验证
修复后验证:
- 保留 UTF-8 with BOM、CRLF 行尾(与仓库其他模块一致);
- 逐行精确重建正确中文,文案对齐 Shell 版本(`check_server_health.sh`)与 `Report.psm1``### inode 使用率`);
- PowerShell 解析器语法校验:`ServerResourceAnalysis.psm1 err=0``DNSCheck.psm1 err=0`
- 全量乱码审计脚本复跑:25 处乱码点全部消除,仅剩 MiddlewareCheck.psm1 第 227 行正常汉字误报;
- 说明:DNSCheck.psm1 文件尾乱码此前会话曾修改工作区文件但**未提交**(git diff 确认 HEAD 仍是乱码),本次纳入一并提交推送;
- 修复文件已同步至桌面运行目录,SHA256 一致,`diff -rq` 无差异。
### 3.4 解决方案
#### 修复 1:ServerResourceAnalysis.psm1 第 8/9/10/11 节乱码重建
由于乱码含 U+FFFD,无法字节级自动还原,按行号精确重建为正确中文(文案与 `check_server_health.sh` / `Report.psm1` 对齐):
| 节 | 修复前(乱码) | 修复后(正确) |
|------|----------------|----------------|
| 8 inode | `妫�娴� inode 浣跨敤鐜�...` / `姝e父 / 璀﹀憡 / 寮傚父` | `检测 inode 使用率...` / `正常 / 警告 / 异常` |
| 9 只读挂载 | `鏃犳剰澶栧彧璇绘寕杞�` / `鍙戠幇鍙�璇绘寕杞�` | `无意外只读挂载` / `发现只读挂载` |
| 10 TCP | `妫�娴� TCP 鐘舵�佸垎甯�` / `TCP鐘舵�佸紓甯�` | `检测 TCP 状态分布...` / `TCP状态异常` |
| 11 僵尸进程+TOP5 | `鍍靛案杩涚▼鍜� TOP5` / `鏃犲兊灏歌繘绋�` / `鑾峰彇 TOP5 杩涚▼` | `僵尸进程和 TOP5 检测` / `无僵尸进程` / `获取 TOP5 进程...` |
同时修正同节内受污染的 `#region` / `#endregion` / 注释行。
#### 修复 2:DNSCheck.psm1 文件尾导出注释
```
# 修复前: # 瀵煎嚭妯″潡鍑芥暟
# 修复后: # 导出模块函数
```
### 3.5 预防措施
1. **文件编码规范**`.psm1/.ps1` 一律 UTF-8 with BOM,避免在 GBK 控制台下被误写;
2. **改码铁律**:批量"转码/改编码"操作前后用字节级校验(BOM + 严格 UTF-8 + GBK 双编码检索关键中文),确认目标中文确实可检索到,防止"转了个寂寞";
3. **新增文案对齐**:PowerShell 模块与 Shell 版本(`check_server_health.sh` / `lib/shell/*.sh`)同一检测项的提示文案保持一致,便于交叉核对与排错;
4. **工具化审计**:后续可复用本次字节级审计脚本,纳入提交流程,杜绝同类乱码再次入库。
### 3.6 问题状态
| 状态 | 说明 |
|------|------|
| 问题类型 | 源码文件中文乱码(UTF-8 被误按 GBK 解码后烘焙进文件) |
| 根本原因 | 文件编码转换不当,乱码不可逆写入源码 |
| 解决状态 | ✅ 已修复 |
| 修复日期 | 2026-09-01 |
---
### 规范文档
- 代码规范: `Docs/PRD/01规范文档/_PRD_规范文档_代码规范.md`
- 问题总结: `Docs/PRD/01规范文档/_PRD_问题总结_记录文档.md`
- 方法总结: `Docs/PRD/01规范文档/_PRD_方法总结_记录文档.md`
- 文档规范: `Docs/PRD/01规范文档/_PRD_规范文档_文档规范.md`
- 测试规范: `Docs/PRD/01规范文档/_PRD_规范文档_测试规范.md`
---
*文档结束*
# 计划执行文档 - 资源检测日志乱码问题处理
## 执行时间
- 创建时间:2026-09-01
- 更新时间:2026-09-01
- 执行状态:✅ 已执行完成
---
## 问题概述
执行主运行脚本后,资源检测(inode 使用率、只读挂载、TCP 状态分布、僵尸进程、TOP5 进程)日志输出中文乱码;另有模块文件尾部导出注释乱码。
**主要问题:**
1. 日志输出中文乱码:`妫�娴� inode 浣跨敤鐜�...``TCP鐘舵�佸垎甯�``鏃犲兊灏歌繘绋�`
2. 模块文件末尾注释乱码:`# 瀵煎嚭妯″潡鍑芥暟`
---
## 执行步骤
### 步骤 1:问题定位
- [x] 读取 PRD 问题文档 / 确认现象
- [x] 分析报错信息(截取原始日志原文)
- [x] 识别问题域:乱码仅出现在资源检测(第 8/9/10/11 节)与模块尾部注释;Shell 版本脚本输出正常
### 步骤 2:根因分析
#### 根因:UTF-8 中文被误按 GBK 解码后再次以 UTF-8 存回,乱码"烘焙"进源码文件
**关键证据:**
1. 文件为 UTF-8 with BOM,严格 UTF-8 解码**通过**(编辑器不报错);
2. 正确的"检测系统负载"(第 7 节)在 UTF-8/GBK 双编码下均能找到,而同文件第 8/9/10/11 节的正确中文**在两种编码下均找不到**
3. 乱码含不可逆的 U+FFFD 替换字符,字节级自动复原有损(按 GBK 反编码在 U+FFFD 处失败);
4. 全量字节级审计确认乱码点共 25 处:
- `ServerResourceAnalysis.psm1`:第 8/9/10/11 节,24 处
- `DNSCheck.psm1`:文件尾"导出模块函数"注释,1 处
- `MiddlewareCheck.psm1` 第 227 行为**误报**(正常汉字"父")
### 步骤 3:解决方案
1. **不可自动还原**(U+FFFD 有损):按行号精确重建正确中文,文案对齐 Shell 版本(`check_server_health.sh`)与 `Report.psm1`
2. **保留技术属性**:UTF-8 with BOM + CRLF 行尾;
3. **工具化审计**:编写字节级审计脚本(BOM + 严格 UTF-8 + 双编码检索)扫描全部 `.psm1/.ps1`,作为修复前后对照依据。
### 步骤 4:修复执行
- [x] 重建 ServerResourceAnalysis.psm1 第 8/9/10/11 节 24 处乱码(`#region``Write-Log` 消息、状态串、注释)
- [x] 重建 DNSCheck.psm1 文件尾"导出模块函数"注释(1 处;此前会话改过工作区但未提交,git diff 确认 HEAD 仍为乱码,本次一并修复提交)
- [x] PowerShell 解析器语法校验(err=0)
- [x] 全量乱码审计复跑清零
- [x] 同步至桌面运行目录并复核 SHA256 / diff
---
## 执行结果
### 已修复内容
| 位置 | 修复前(乱码) | 修复后(正确) |
|------|----------------|----------------|
| ServerResourceAnalysis.psm1 第 8 节 | `#region 8. inode 浣跨敤鐜囨��娴�` | `#region 8. inode 使用率检测` |
| 同上 消息 | `妫�娴� inode 浣跨敤鐜�...` | `检测 inode 使用率...` |
| 同上 状态 | `姝e父 / 璀﹀憡 / 寮傚父` | `正常 / 警告 / 异常` |
| 第 9 节 成功消息 | `鏃犳剰澶栧彧璇绘寕杞�` | `无意外只读挂载` |
| 第 9 节 警告消息 | `鍙戠幇鍙�璇绘寕杞�` | `发现只读挂载` |
| 第 10 节 region/消息 | `TCP 鐘舵�佸垎甯冩��娴�` / `妫�娴� TCP 鐘舵�佸垎甯�` | `TCP 状态分布检测` / `检测 TCP 状态分布...` |
| 第 10 节 状态消息 | `TCP鐘舵�佸紓甯�` / `TCP鐘舵�佹�e父` | `TCP状态异常` / `TCP状态正常` |
| 第 11 节 region/消息 | `鍍靛案杩涚▼鍜� TOP5 妫�娴�` / `妫�娴嬪兊灏歌繘绋�` | `僵尸进程和 TOP5 检测` / `检测僵尸进程...` |
| 第 11 节 成功/警告/TOP5 | `鏃犲兊灏歌繘绋�` / `鍙戠幇 {n} 涓�鍍靛案杩涚▼` / `鑾峰彇 TOP5 杩涚▼` | `无僵尸进程` / `发现 {n} 个僵尸进程` / `获取 TOP5 进程...` |
| DNSCheck.psm1 文件尾 | `# 瀵煎嚭妯″潡鍑芥暟` | `# 导出模块函数`(此前会话改过工作区未提交,本次一并提交) |
### 验证结果
- ✅ PowerShell 解析器语法校验:`ServerResourceAnalysis.psm1 err=0``DNSCheck.psm1 err=0``MiddlewareCheck.psm1 err=0`
- ✅ 全量乱码审计脚本复跑:25 处乱码点全部消除,仅剩 MiddlewareCheck.psm1 第 227 行正常汉字误报
- ✅ 修复文件已同步至桌面运行目录 `C:\Users\29194\Desktop\Sever_health_check\modules\`,SHA256 与仓库一致,`diff -rq` 无差异
---
## 附录:关键代码位置
| 问题 | 行号 | 当前错误代码(乱码) | 正确代码 |
|------|------|----------------------|----------|
| inode region | 894 | `#region 8. inode 浣跨敤鐜囨��娴�` | `#region 8. inode 使用率检测 (PRD 2.5)` |
| inode 消息 | 896 | `Write-Log ... "妫�娴� inode 浣跨敤鐜�..."` | `Write-Log ... "检测 inode 使用率..."` |
| inode 状态 | 940 | `"姝e父" ... "璀﹀憡" ... "寮傚父"` | `"正常" ... "警告" ... "异常"` |
| 只读挂载 成功 | 996 | `" 鏃犳剰澶栧彧璇绘寕杞�"` | `" 无意外只读挂载"` |
| 只读挂载 警告 | 1004 | `" 鍙戠幇鍙�璇绘寕杞�: $line"` | `" 发现只读挂载: $line"` |
| TCP region | 1022 | `#region 10. TCP 鐘舵�佸垎甯冩��娴�` | `#region 10. TCP 状态分布检测 (PRD 2.5)` |
| TCP 消息 | 1024 | `"妫�娴� TCP 鐘舵�佸垎甯�..."` | `"检测 TCP 状态分布..."` |
| TCP 异常 | 1070 | `" TCP鐘舵�佸紓甯�: $tcpWarning"` | `" TCP状态异常: $tcpWarning"` |
| TCP 正常 | 1074 | `" TCP鐘舵�佹�e父: CLOSE_WAIT=..."` | `" TCP状态正常: CLOSE_WAIT=..."` |
| 僵尸 region | 1088 | `#region 11. 鍍靛案杩涚▼鍜� TOP5 妫�娴�` | `#region 11. 僵尸进程和 TOP5 检测 (PRD 2.5)` |
| 僵尸 消息 | 1090 | `"妫�娴嬪兊灏歌繘绋�..."` | `"检测僵尸进程..."` |
| 僵尸 成功 | 1108 | `" 鏃犲兊灏歌繘绋�"` | `" 无僵尸进程"` |
| 僵尸 警告 | 1116 | `" 鍙戠幇 $zombieCount 涓�鍍靛案杩涚▼"` | `" 发现 $zombieCount 个僵尸进程"` |
| TOP5 注释/消息 | 1128/1150 | `# TOP5 杩涚▼锛堟寜鍐呭瓨鍜孋PU锛�` / `" TOP5杩涚▼锛堟寜鍐呭瓨锛�:"` | `# TOP5 进程(按内存和CPU)` / `" TOP5进程(按内存):"` |
| DNSCheck 导出 | 295 | `# 瀵煎嚭妯″潡鍑芥暟` | `# 导出模块函数` |
---
## 问题状态
| 状态 | 说明 |
|------|------|
| 问题类型 | 源码文件中文乱码(UTF-8 被误按 GBK 解码后烘焙进文件) |
| 影响范围 | 资源检测日志输出、模块导出注释 |
| 当前状态 | ✅ 已修复 |
| 修复日期 | 2026-09-01 |
---
*文档结束*
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论