Initial commit
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user