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)