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) }