修复容器、二进制的特定环境下,偶发性存留多僵尸进程的问题

This commit is contained in:
2026-08-03 21:51:21 +08:00
parent 2f9612a1fa
commit 0d292ab29c
+12 -4
View File
@@ -25,12 +25,12 @@ var FrpcTemplateContent string
var ( var (
cachedFrpcPath string cachedFrpcPath string
frpsPathMutex sync.Mutex frpcPathMutex sync.Mutex
) )
func getFrpcPath() (string, error) { func getFrpcPath() (string, error) {
frpsPathMutex.Lock() frpcPathMutex.Lock()
defer frpsPathMutex.Unlock() defer frpcPathMutex.Unlock()
if cachedFrpcPath != "" { if cachedFrpcPath != "" {
if _, err := os.Stat(cachedFrpcPath); err == nil { if _, err := os.Stat(cachedFrpcPath); err == nil {
@@ -144,7 +144,6 @@ func GenerateFrpcConfig() error {
return fmt.Errorf("渲染模板失败: %w", err) return fmt.Errorf("渲染模板失败: %w", err)
} }
// 所有文件写入 ./data/ 目录
if err := os.MkdirAll("./data", 0755); err != nil { if err := os.MkdirAll("./data", 0755); err != nil {
return fmt.Errorf("创建 data 目录失败: %w", err) return fmt.Errorf("创建 data 目录失败: %w", err)
} }
@@ -219,6 +218,15 @@ func StartFrpc() error {
return fmt.Errorf("启动 frpc 失败: %w", err) 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 { if err := os.WriteFile("./data/frpc.pid", []byte(fmt.Sprintf("%d", cmd.Process.Pid)), 0644); err != nil {
return fmt.Errorf("保存 PID 失败: %w", err) return fmt.Errorf("保存 PID 失败: %w", err)
} }