From 46a4e73ec7fa9090f604f666143a9efd7c0d1ede Mon Sep 17 00:00:00 2001 From: Baobhan Sith <80159437+Heavrnl@users.noreply.github.com> Date: Tue, 6 May 2025 22:36:23 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=94=B9=E8=BF=9B=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E7=A3=81=E7=9B=98=E4=BD=BF=E7=94=A8=E6=83=85=E5=86=B5=E7=9A=84?= =?UTF-8?q?=E5=85=BC=E5=AE=B9=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Related to #16 --- .../src/services/status-monitor.service.ts | 59 ++++++++++++++----- 1 file changed, 45 insertions(+), 14 deletions(-) diff --git a/packages/backend/src/services/status-monitor.service.ts b/packages/backend/src/services/status-monitor.service.ts index 7fd02fe..6637ef1 100644 --- a/packages/backend/src/services/status-monitor.service.ts +++ b/packages/backend/src/services/status-monitor.service.ts @@ -214,22 +214,53 @@ export class StatusMonitorService { try { - // 使用 df -kP / 获取 POSIX 标准格式输出,更稳定 - const dfOutput = await this.executeSshCommand(sshClient, "df -kP /"); - const lines = dfOutput.split('\n'); - if (lines.length >= 2) { - const parts = lines[1].split(/\s+/); - if (parts.length >= 5) { - const total = parseInt(parts[1], 10); - const used = parseInt(parts[2], 10); - const percentMatch = parts[4].match(/(\d+)%/); - if (!isNaN(total) && !isNaN(used) && percentMatch) { - status.diskTotal = total; status.diskUsed = used; - status.diskPercent = parseFloat(percentMatch[1]); - } + let dfCommand = "df -kP /"; // 优先尝试 POSIX 标准格式 + let dfOutput: string; + try { + dfOutput = await this.executeSshCommand(sshClient, dfCommand); + } catch (errP) { + dfCommand = "df -k /"; // 备用方案 + try { + dfOutput = await this.executeSshCommand(sshClient, dfCommand); + } catch (errK) { + dfOutput = ""; } } - } catch (err) { /* 静默处理 */ } + + if (dfOutput) { + const lines = dfOutput.split('\n'); + let parsedDiskInfo = false; + // 从第二行开始查找根挂载点信息 (跳过表头) + for (let i = 1; i < lines.length; i++) { + const line = lines[i].trim(); + // 确保是根挂载点,通常以 " /" 结尾 + if (line.endsWith(" /")) { + const parts = line.split(/\s+/); + // 预期 parts 至少包含: 文件系统, 总量(KB), 已用(KB), 可用(KB), 百分比%, 挂载点 + // 例如: /dev/sda1 10307920 3841884 5941800 40% / + if (parts.length >= 5) { + const total = parseInt(parts[1], 10); + const used = parseInt(parts[2], 10); + const percentStr = parts.find(p => p.endsWith('%')); // 查找百分比字符串 + + if (percentStr) { + const percentMatch = percentStr.match(/(\d+)%/); + if (!isNaN(total) && !isNaN(used) && percentMatch && percentMatch[1]) { + status.diskTotal = total; // KB + status.diskUsed = used; // KB + status.diskPercent = parseFloat(percentMatch[1]); + parsedDiskInfo = true; + break; + } + } + } + } + } + + } + } catch (err) { + // 如果捕获到错误 (例如 executeSshCommand 内部的 Promise reject), disk* 字段将保持 undefined + } try { const procStatOutput = await this.executeSshCommand(sshClient, 'cat /proc/stat');