diff --git a/scripts/dev-api.js b/scripts/dev-api.js index e676ed9..237c7e5 100644 --- a/scripts/dev-api.js +++ b/scripts/dev-api.js @@ -479,7 +479,8 @@ function inspectWindowsPortOwners(port = readGatewayPort()) { for (const pid of listeningPids) { const commandLine = readWindowsProcessCommandLine(pid) if (looksLikeGatewayCommandLine(commandLine)) gatewayPids.push(pid) - else foreignPids.push(pid) + else if (commandLine) foreignPids.push(pid) // 只有确实读到非 Gateway 命令行时才归为 foreign + else gatewayPids.push(pid) // 命令行读不到时,假定为 Gateway(避免权限问题导致误报) } return { @@ -1022,7 +1023,18 @@ const handlers = { // 服务管理 async get_services_status() { const label = 'ai.openclaw.gateway' - const { running, pid } = isMac ? macCheckService(label) : isLinux ? linuxCheckGateway() : await winCheckGateway() + let { running, pid } = isMac ? macCheckService(label) : isLinux ? linuxCheckGateway() : await winCheckGateway() + + // 通用兜底:进程检测说没运行,但端口实际在监听 → Gateway 已在运行 + if (!running) { + const port = readGatewayPort() + const portOpen = await new Promise(resolve => { + const sock = net.createConnection(port, '127.0.0.1', () => { sock.destroy(); resolve(true) }) + sock.on('error', () => resolve(false)) + sock.setTimeout(2000, () => { sock.destroy(); resolve(false) }) + }) + if (portOpen) { running = true } + } let cliInstalled = false if (isMac) { diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index e1a4d62..b7bf1eb 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -328,7 +328,7 @@ dependencies = [ [[package]] name = "clawpanel" -version = "0.7.2" +version = "0.7.3" dependencies = [ "base64 0.22.1", "chrono", diff --git a/src-tauri/src/commands/service.rs b/src-tauri/src/commands/service.rs index f0227ee..6044181 100644 --- a/src-tauri/src/commands/service.rs +++ b/src-tauri/src/commands/service.rs @@ -724,7 +724,13 @@ mod platform { Some(command_line) if super::looks_like_gateway_command_line(&command_line) => { gateway_pids.push(pid); } - _ => foreign_pids.push(pid), + Some(command_line) if !command_line.is_empty() => { + foreign_pids.push(pid); + } + _ => { + // 命令行读不到时,假定为 Gateway(避免权限问题导致误报) + gateway_pids.push(pid); + } } }