From ec60a7994a7bbb4971eb08ba48b4e2482e26633c Mon Sep 17 00:00:00 2001 From: lxh2875931338 Date: Fri, 7 Aug 2026 22:50:29 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=9B=E7=A8=8B=E5=A4=84=E7=90=86=E6=95=88?= =?UTF-8?q?=E6=9E=9C=E5=88=B0=E4=BD=8D=EF=BC=8C=E8=A1=A5=E5=85=85=E5=83=B5?= =?UTF-8?q?=E5=B0=B8=E8=BF=9B=E7=A8=8B=E5=9B=9E=E6=94=B6=E5=8A=A8=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/process/manager.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/internal/process/manager.go b/internal/process/manager.go index 9f4dc45..290dd70 100644 --- a/internal/process/manager.go +++ b/internal/process/manager.go @@ -604,6 +604,17 @@ func (pm *ProcessManager) startLocked(ctx context.Context) error { return fmt.Errorf("启动 frpc 失败: %w", err) } + // ⭐ 关键修复:启动 goroutine 回收子进程,避免僵尸 + go func() { + err := cmd.Wait() + if err != nil { + log.Printf("[INFO] frpc 进程 (PID: %d) 已退出: %v", cmd.Process.Pid, err) + } else { + log.Printf("[INFO] frpc 进程 (PID: %d) 正常退出", cmd.Process.Pid) + } + // 进程退出后,如果端口没有被占用,Status 逻辑会清理 PID 文件 + }() + // 立即写入 PID 文件 if err := pm.writePIDFile(cmd.Process.Pid); err != nil { log.Printf("[WARN] 写入 PID 文件失败: %v", err)