62 lines
1.4 KiB
Go
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
|
|
}
|