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

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