package service import ( "os" "os/exec" "syscall" "time" "go.uber.org/zap" ) // RestartCoreService 重启核心服务(用于管理员操作) type RestartCoreService struct { logger *zap.Logger } // NewRestartCoreService 创建重启核心服务 func NewRestartCoreService(logger *zap.Logger) *RestartCoreService { return &RestartCoreService{ logger: logger, } } // RestartCore 重启核心服务(优雅重启) func (s *RestartCoreService) RestartCore() error { s.logger.Info("开始重启核心服务...") // 1. 记录当前进程 ID pid := os.Getpid() s.logger.Info("当前进程 ID", zap.Int("pid", pid)) // 2. 获取当前可执行文件路径 execPath, err := os.Executable() if err != nil { s.logger.Error("获取可执行文件路径失败", zap.Error(err)) return err } // 3. 启动新进程 cmd := exec.Command(execPath) cmd.SysProcAttr = &syscall.SysProcAttr{ HideWindow: true, // Windows 隐藏窗口 CreationFlags: syscall.CREATE_NEW_PROCESS_GROUP, // Windows 创建新进程组 } if err := cmd.Start(); err != nil { s.logger.Error("启动新进程失败", zap.Error(err)) return err } s.logger.Info("新进程启动成功", zap.Int("new_pid", cmd.Process.Pid)) // 4. 等待一小段时间确保新进程稳定 time.Sleep(2 * time.Second) // 5. 退出当前进程 s.logger.Info("当前进程即将退出") os.Exit(0) return nil }