From 0d292ab29c39c40618d4687c49f0384985d5c79f Mon Sep 17 00:00:00 2001 From: lxh2875931338 Date: Mon, 3 Aug 2026 21:51:21 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=AE=B9=E5=99=A8=E3=80=81?= =?UTF-8?q?=E4=BA=8C=E8=BF=9B=E5=88=B6=E7=9A=84=E7=89=B9=E5=AE=9A=E7=8E=AF?= =?UTF-8?q?=E5=A2=83=E4=B8=8B=EF=BC=8C=E5=81=B6=E5=8F=91=E6=80=A7=E5=AD=98?= =?UTF-8?q?=E7=95=99=E5=A4=9A=E5=83=B5=E5=B0=B8=E8=BF=9B=E7=A8=8B=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frp.go | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/frp.go b/frp.go index 1462e58..b525ee4 100644 --- a/frp.go +++ b/frp.go @@ -25,12 +25,12 @@ var FrpcTemplateContent string var ( cachedFrpcPath string - frpsPathMutex sync.Mutex + frpcPathMutex sync.Mutex ) func getFrpcPath() (string, error) { - frpsPathMutex.Lock() - defer frpsPathMutex.Unlock() + frpcPathMutex.Lock() + defer frpcPathMutex.Unlock() if cachedFrpcPath != "" { if _, err := os.Stat(cachedFrpcPath); err == nil { @@ -144,7 +144,6 @@ func GenerateFrpcConfig() error { return fmt.Errorf("渲染模板失败: %w", err) } - // 所有文件写入 ./data/ 目录 if err := os.MkdirAll("./data", 0755); err != nil { return fmt.Errorf("创建 data 目录失败: %w", err) } @@ -219,6 +218,15 @@ func StartFrpc() error { return fmt.Errorf("启动 frpc 失败: %w", err) } + // 回收子进程(防止僵尸进程) + go func() { + if err := cmd.Wait(); err != nil { + log.Printf("frpc 子进程退出: %v", err) + } + // 子进程退出后清理 PID 文件 + os.Remove("./data/frpc.pid") + }() + if err := os.WriteFile("./data/frpc.pid", []byte(fmt.Sprintf("%d", cmd.Process.Pid)), 0644); err != nil { return fmt.Errorf("保存 PID 失败: %w", err) }