Files
Meshray-Manager/internal/service/restart_core.go
T
2026-06-30 15:14:37 +08:00

62 lines
1.4 KiB
Go

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
}