提交 00db3861 authored 作者: 陈泽健's avatar 陈泽健

fix(servers): 解决模块化拆分后IP和NTP检测脚本执行错误

- 采用文件下载方式替代JSON解析解决IP检测截断问题
- 直接执行SSH命令替代Shell脚本解决NTP检测问题
- 添加Parse-ResourceCheckText函数解析纯文本输出
- 更新Invoke-RemoteShellCheck函数支持base64编码传输
- 修改Test-ServerResources-Shell函数使用文件下载方式
- 优化NTP检测逻辑使用timedatectl命令直接获取状态
- 调整配置IP检测改为直接SSH命令搜索配置文件中的IP
- 更新NTP结果显示格式并优化错误处理机制
上级 2d9524be
......@@ -28,6 +28,10 @@
#
# ==============================================================================
# 强制英文输出,避免中文干扰JSON解析
export LANG=C
export LC_ALL=C
# 加载基础函数库
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
......
......@@ -44,7 +44,6 @@ JAVA_SERVICES["auth"]="ubains-auth.jar"
JAVA_SERVICES["gateway"]="ubains-gateway.jar"
JAVA_SERVICES["system"]="ubains-modules-system.jar"
JAVA_SERVICES["meeting2.0"]="ubains-meeting-inner-api-1.0-SNAPSHOT.jar"
JAVA_SERVICES["meeting3.0"]="ubains-meeting-inner-api-1.0-SNAPSHOT.jar"
JAVA_SERVICES["mqtt"]="ubains-meeting-mqtt-1.0-SNAPSHOT.jar"
JAVA_SERVICES["quartz"]="ubains-meeting-quartz-1.0-SNAPSHOT.jar"
JAVA_SERVICES["message"]="ubains-meeting-message-scheduling-1.0-SNAPSHOT.jar"
......
......@@ -26,6 +26,10 @@
#
# ==============================================================================
# 强制英文输出,避免中文干扰JSON解析
export LANG=C
export LC_ALL=C
# 加载基础函数库
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
......
......@@ -28,6 +28,10 @@
#
# ==============================================================================
# 强制英文输出,避免中文干扰JSON解析
export LANG=C
export LC_ALL=C
# 加载基础函数库
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
......
......@@ -273,3 +273,23 @@ main
---
*文档结束*
## 8. 后续优化建议(2026-05-13)
### 8.1 文件下载方式
虽然IP检测当前问题已解决,但为避免将来出现类似输出截断问题,建议参考资源检测的解决方案:
**采用文件下载方式**:
1. 将检测结果输出到远程txt文件
2. 使用 `Download-RemoteFile` 函数下载到本地
3. 解析本地文件内容,完全避免plink.exe输出缓冲区限制
### 8.2 实现参考
可参照 `Test-ServerResources-Shell` 函数的实现方式:
- 使用 `--format text` 参数输出纯文本
- 使用 `Download-RemoteFile` 下载文件
- 使用本地 `Get-Content` 读取并解析
---
*文档结束*
......@@ -281,4 +281,56 @@ JSON输出在 `"ntp_servers": "ntp1.aliyun.com,` 处被截断,这是因为plin
---
## 9. 最终解决方案(2026-05-13)
### 9.1 问题分析
虽然通过临时文件方式可以避免截断,但在实践中发现,对于NTP检测这种简单检测,直接执行SSH命令并解析简单文本输出更为可靠。
### 9.2 最终解决方案
**采用直接SSH命令方式**:不使用Shell脚本,直接通过SSH执行检测命令,解析简单文本输出。
### 9.3 技术要点
1. 使用 `timedatectl status` 命令获取NTP状态
2. 使用单引号命令字符串避免PowerShell变量展开
3. 直接解析文本输出,不依赖JSON
### 9.4 代码修改
**文件**`check_server_health.ps1`
**位置**`Test-NTPService-Shell` 函数
**修改前**:使用Shell脚本
```powershell
$result = Invoke-RemoteShellCheck -Server $Server -ScriptName "ntp_check.sh" -Arguments "--format json"
$data = ConvertFrom-ShellJson -JsonString $result
```
**修改后**:直接SSH命令
```powershell
# 获取NTP状态
$cmd = "export LANG=C && timedatectl status 2>/dev/null | grep -E 'System clock synchronized|NTP service'"
$result = Invoke-SSHCommand -HostName $Server.IP -User $Server.User -Pass $Server.Pass -Port $Server.Port -Command $cmd
# 获取NTP服务器(使用单引号避免变量展开)
$cmd2 = @'
export LANG=C && cat /etc/chrony.conf 2>/dev/null | grep '^server ' | awk '{print $2}' | head -1
'@
$result2 = Invoke-SSHCommand -HostName $Server.IP -User $Server.User -Pass $Server.Pass -Port $Server.Port -Command $cmd2
# 解析输出并构建结果
```
### 9.5 优化功能回填(更新)
| 序号 | 优化内容 | 状态 |
|------|----------|------|
| 1 | 修复ntp_servers双层引号问题 | ✅ 已完成 |
| 2 | 使用临时文件避免截断 | ✅ 已完成 |
| 3 | 移除Shell脚本中的exec 2>/dev/null | ✅ 已完成 |
| 4 | **改用直接SSH命令方式** | ✅ 已完成 |
| 5 | **使用单引号避免变量展开** | ✅ 已完成 |
| 6 | **简化NTP检测逻辑** | ✅ 已完成 |
---
*文档结束*
......@@ -263,4 +263,71 @@ JSON输出在 `"total_mb":` 处被截断,导致解析失败。这是因为plin
---
---
## 8. 问题三补充说明(最终解决方案)
### 8.1 问题分析
JSON输出仍然存在截断问题,因为通过SSH命令读取文件内容时,plink.exe的输出缓冲区限制仍然存在。
### 8.2 最终解决方案
**采用文件下载方式**:将检测结果输出到远程txt文件,然后使用pscp下载到本地,最后解析本地文件。这样可以完全避免plink.exe输出缓冲区限制。
### 8.3 技术要点
1. 执行Shell脚本时将输出重定向到远程文件
2. 使用 `Download-RemoteFile` 函数下载文件到本地
3. 使用本地文件解析,避免SSH输出截断
4. 使用纯文本格式输出,更稳定可靠
### 8.4 代码修改
**文件**:`check_server_health.ps1`
**位置**:`Test-ServerResources-Shell` 函数
**修改前**:使用JSON解析方式
```powershell
$arguments = "--format json --check all"
$result = Invoke-RemoteShellCheck -Server $Server -ScriptName "resource_check.sh" -Arguments $arguments
$data = ConvertFrom-ShellJson -JsonString $result
```
**修改后**:使用文件下载方式
```powershell
# 执行远程脚本,将输出保存到文件
$cmd = "cd $remotePath && chmod +x common.sh resource_check.sh && ./resource_check.sh --format text --check all > $remoteOutputFile 2>&1"
# 下载输出文件
$downloadResult = Download-RemoteFile -Server $Server -RemotePath $remoteOutputFile -LocalPath $localOutputFile -TimeoutSeconds 60
# 读取文件内容并解析
$content = Get-Content $localOutputFile -Raw -Encoding UTF8
$results = Parse-ResourceCheckText -Content $content
```
### 8.5 新增解析函数
**函数名**:`Parse-ResourceCheckText`
**功能**:解析Shell脚本的纯文本输出
**支持解析内容**
- CPU核心数、使用率、负载
- 内存总计、已用、使用率
- 磁盘挂载点、大小、使用量、使用率
- TCP连接数、TIME_WAIT数
### 8.6 优化功能回填(更新)
| 序号 | 优化内容 | 状态 |
|------|----------|------|
| 1 | 修正Write-Log日志级别错误 | ✅ 已完成 |
| 2 | 添加中文输出过滤 | ✅ 已完成 |
| 3 | 限制调试输出长度 | ✅ 已完成 |
| 4 | 使用临时文件避免截断 | ✅ 已完成 |
| 5 | 移除Shell脚本中的exec 2>/dev/null | ✅ 已完成 |
| 6 | **改用文件下载方式** | ✅ 已完成 |
| 7 | **新增Parse-ResourceCheckText函数** | ✅ 已完成 |
| 8 | **支持纯文本格式解析** | ✅ 已完成 |
---
*文档结束*
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论