process

package
v0.21.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 26, 2026 License: MIT Imports: 29 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var ErrNotImplemented = errors.New("该启动方式尚未实现")

ErrNotImplemented 表示该启动方式尚未实现。 docker/rcon 等未落地的策略统一返回此错误,避免误用。

Functions

func CheckDockerAvailable

func CheckDockerAvailable(ctx context.Context) (string, error)

CheckDockerAvailable 探测本机 Docker 守护进程可用性(FR-237):连客户端 + ServerVersion。 返回 Engine 版本;守护进程未装 / 未起 / 不可达时返回 error。供创建向导选 docker 模式前先测。

func ComposeEnv

func ComposeEnv(base []string, spec CommandSpec) []string

ComposeEnv 合成进程最终环境: 1) Worker 自身环境(os.Environ)作为基线,保留系统 PATH/编码等; 2) 注入 JAVA_HOME(如果提供)和对应 PATH 前缀; 3) 叠加实例自定义 EnvVars(覆盖基线同名键)。 始终不修改调用方的 map。

func PullDockerImage

func PullDockerImage(ctx context.Context, ref string) error

PullDockerImage 从 registry 拉取镜像到 Worker 本机。 拉取流必须读尽,否则 Docker 守护进程可能中断拉取。

func RemoveDockerImage

func RemoveDockerImage(ctx context.Context, ref string, force bool) error

RemoveDockerImage 删除 Worker 本机 Docker 镜像。

Types

type CommandSpec

type CommandSpec struct {
	UUID         string
	Name         string
	StartCommand string
	// StopCommand 优雅停止时写入进程 stdin 的命令(按实例角色派生:MC 后端 stop / 代理 end)。
	// 空时由策略回退到默认 "stop"。仅 daemon 策略经 stdin 优雅关服时使用。
	StopCommand string
	WorkDir     string
	EnvVars     map[string]string
	// JavaHome 显式指定 JAVA_HOME(来自实例绑定的 JDK),非空时 Worker 会
	// 把它注入到进程环境并把 JavaHome/bin 接入 PATH。
	JavaHome string
	// JDKBinPath 显式指定要前置到 PATH 的目录;空时由 JavaHome 派生。
	JDKBinPath  string
	AutoRestart bool
	ProcessType ProcessType
	// ProbePort 是实例 ServerProbe /metrics 端口(CP 分配后下发)。daemon 策略透传到
	// wrapper→PID 记录,供 Worker 重启恢复后心跳继续自采(FR-060);0=未部署探针。
	ProbePort int
	// GracefulStopTimeoutSeconds 是优雅停止超时(秒,CP 从平台设置下发,FR-063)。daemon 策略
	// 透传到 wrapper 做超时强杀兜底;0=未指定,wrapper 回退 env/默认。值在启动时定型。
	GracefulStopTimeoutSeconds int
	// Image 是 docker 模式的容器镜像引用(如 itzg/minecraft-server:latest)。
	// 仅 docker 策略使用;缺失时 docker 启动报错(ADR-019)。
	Image string
	// PortMappings 是 docker 模式的容器端口↔宿主端口映射(宿主端口来自 FR-032 端口池)。
	// 仅 docker 策略使用,发布容器内端口到宿主(ADR-019)。
	PortMappings []PortMapping
	// CPULimit 是 docker 模式的 CPU 核数上限(如 1.5 表示 1.5 核),注入 HostConfig.NanoCPUs。
	// 仅 docker 策略使用;0=不限制(FR-079,见 ADR-019)。
	CPULimit float64
	// MemLimitMB 是 docker 模式的内存上限(MiB),注入 HostConfig.Memory。
	// 仅 docker 策略使用;0=不限制(FR-079,见 ADR-019)。
	MemLimitMB int64
	// DiskLimitMB 是 docker 模式的磁盘上限(MiB),仅持久化与展示,v1 不注入 HostConfig。
	// bind-mount 工作目录无法用 HostConfig 简单施加磁盘配额(依赖存储驱动),留作前向兼容(FR-079)。
	DiskLimitMB int64
}

CommandSpec 是启动一个实例所需的全部配置。 各策略实现(direct/daemon/docker)从同一份配置派生各自所需参数。

type CrashInfo

type CrashInfo struct {
	// ExitCode 进程退出码;无法获知(Wait 出错无退出状态 / 容器 Wait 错误)时为 -1。
	ExitCode int
	// Signal 终止信号名(Unix,如 killed);Windows / 非信号退出为空。
	Signal string
	// DurationMs 本次运行时长(毫秒)。
	DurationMs int64
	// OccurredAt 崩溃发生时刻。
	OccurredAt time.Time
}

CrashInfo 进程非正常退出的现场信息(FR-313):退出码 ≠ 0,或 RUNNING/STARTING 态 意外退出时由策略捕获,经 Manager 崩溃回调扇出、组装崩溃快照上报 CP。

type IProcessCommand

type IProcessCommand interface {
	// Start 启动实例进程。ctx 用于取消启动阶段(如连接 wrapper 超时)。
	Start(ctx context.Context) error
	// Stop 优雅停止实例。
	Stop() error
	// Kill 强制终止实例。
	Kill() error
	// SendCommand 向实例 stdin 发送一行命令。
	SendCommand(command string) error
	// State 返回策略当前记录的实例状态。
	State() InstanceState
	// Close 释放策略持有的资源(socket 连接、goroutine 等),
	// 不影响被管理的游戏服进程本身(daemon 模式下 wrapper 继续运行)。
	Close() error
	// GetPID 返回实例进程的 PID,用于从 OS 层采集进程内存等指标。
	// 未启动或已退出时返回 0。
	GetPID() int
}

IProcessCommand 进程启动策略接口。 Manager 按 instance.ProcessType 选择具体实现(direct/daemon/docker), 把「如何启动/停止/发送命令」的差异收敛到策略内部,Manager 只负责路由和生命周期记账。 参见 ADR-003: 守护进程 Wrapper 模式。

type ImageSummary

type ImageSummary struct {
	ID        string
	Tags      []string
	SizeBytes int64
	Created   int64
}

ImageSummary 是 Worker 本机一个 Docker 镜像的精简描述(FR-078,ADR-019)。

func ListDockerImages

func ListDockerImages(ctx context.Context) ([]ImageSummary, error)

ListDockerImages 列出 Worker 本机 Docker 镜像。 Docker 不可用时返回错误,调用方据此回报 docker_available=false(FR-078)。

type Instance

type Instance struct {
	UUID         string
	Name         string
	StartCommand string
	// StopCommand 优雅停止命令(按角色派生:MC 后端 stop / 代理 end);空时回退默认 stop。
	StopCommand  string
	WorkDir      string
	EnvVars      map[string]string
	JDKPath      string
	JDKBinPath   string
	RCONPort     int
	RCONPassword string
	// ProbePort 是实例 ServerProbe /metrics 端口(CP 分配后随 Create 下发)。
	// 心跳采集器据此自采每实例富指标(FR-060);0=未部署探针,心跳跳过该实例。
	ProbePort int
	// GracefulStopTimeoutSeconds 是优雅停止超时(秒,CP 从平台设置下发,FR-063)。daemon 启动时
	// 透传到 wrapper 做超时强杀兜底;0=未指定,wrapper 回退 env/默认。值在启动时随 spec 定型。
	GracefulStopTimeoutSeconds int
	// Image 是 docker 模式的容器镜像引用(ADR-019);仅 docker 实例使用。
	Image string
	// PortMappings 是 docker 模式的容器端口↔宿主端口映射(ADR-019);仅 docker 实例使用。
	PortMappings []PortMapping
	// CPULimit / MemLimitMB / DiskLimitMB 是 docker 模式的资源限额(FR-079,见 ADR-019);
	// 仅 docker 实例使用,值在 Start 时随 spec 定型。0=不限制;DiskLimitMB v1 仅记账不注入。
	CPULimit    float64
	MemLimitMB  int64
	DiskLimitMB int64
	State       InstanceState
	AutoRestart bool
	CrashCount  int
	// contains filtered or unexported fields
}

Instance 运行中的实例记账信息。 策略实现(direct/daemon)持有进程/socket 句柄,这里只保留 Manager 路由与查询所需字段。

type InstanceSnapshot

type InstanceSnapshot struct {
	UUID      string
	State     string // STOPPED, STARTING, RUNNING, STOPPING, CRASHED
	ProbePort int    // ServerProbe /metrics 端口;>0 且 RUNNING 时心跳采集器自采富指标(FR-060)
	PID       int    // 受管实例根进程 PID;>0 时心跳可采集进程 TOPN(FR-170)
}

InstanceSnapshot 表示单个实例的状态快照(用于心跳上报)。

type InstanceState

type InstanceState string

InstanceState 实例运行状态。

const (
	StateStopped  InstanceState = "STOPPED"
	StateStarting InstanceState = "STARTING"
	StateRunning  InstanceState = "RUNNING"
	StateStopping InstanceState = "STOPPING"
	StateCrashed  InstanceState = "CRASHED"
)

type Manager

type Manager struct {
	// contains filtered or unexported fields
}

Manager 进程管理器。 它通过 IProcessCommand 策略接口支持多种启动方式(direct/daemon/docker), 参见 ADR-003: 守护进程 Wrapper 模式。

func NewManager

func NewManager(serversDir string) *Manager

NewManager 创建进程管理器。

func (*Manager) Create

func (m *Manager) Create(uuid, name, startCommand, stopCommand, workDir string, envVars map[string]string, autoRestart bool, processType ProcessType, jdkPath, jdkBinPath string, probePort, gracefulStopTimeoutSeconds int) error

Create 创建实例(但不启动)。processType 决定启动方式(direct/daemon/docker/rcon)。 jdkPath / jdkBinPath 非空时会被注入到实例启动时的环境。 stopCommand 为优雅停止命令(按角色派生:MC 后端 stop / 代理 end),空时回退默认 stop。 probePort 为实例 ServerProbe /metrics 端口(CP 分配),供心跳采集器自采富指标(FR-060);0=未部署。 gracefulStopTimeoutSeconds 为优雅停止超时(秒,CP 从平台设置下发,FR-063);0=未指定,wrapper 回退默认。

func (*Manager) GetAllInstanceStates

func (m *Manager) GetAllInstanceStates() []InstanceSnapshot

GetAllInstanceStates 返回所有实例的状态快照(用于心跳上报)。

func (*Manager) GetInstance

func (m *Manager) GetInstance(uuid string) (*Instance, bool)

GetInstance 获取实例信息。

func (*Manager) GetInstanceDockerStats

func (m *Manager) GetInstanceDockerStats(ctx context.Context, uuid string) (cpuPercent float64, memBytes int64, memLimitBytes int64, ok bool)

GetInstanceDockerStats 采集 docker 实例的容器资源指标(CPU%/内存/内存上限,字节)。 非 docker 实例、未运行或采集失败返回 ok=false,调用方据此回退 OS 进程内存路径。

func (*Manager) GetInstancePID

func (m *Manager) GetInstancePID(uuid string) int

GetInstancePID 获取实例进程的 PID。 策略未启动或已退出时返回 0。

func (*Manager) GetRCONConfig

func (m *Manager) GetRCONConfig(uuid string) (port int, password string, err error)

GetRCONConfig 获取实例的 RCON 配置。

func (*Manager) GetState

func (m *Manager) GetState(uuid string) (InstanceState, error)

GetState 获取实例状态。

func (*Manager) Kill

func (m *Manager) Kill(uuid string) error

Kill 强制终止实例。

func (*Manager) ListInstances

func (m *Manager) ListInstances() []string

ListInstances 返回所有实例的 UUID 列表。

func (*Manager) PreflightStart

func (m *Manager) PreflightStart(uuid string) ([]PreflightCheckResult, error)

PreflightStart 对已注册实例做启动前同步预检(FR-314):校验 java 运行时、工作目录、启动目标 jar, 供 CP 在转 STARTING 前同步拦截配置错误,终结「配置错误也要启动中→崩溃兜一圈」。 docker 实例整体放行(本地 JDK/文件语义不适用)。实例未注册返回 error。 与 Start 内嵌的 preflightJavaVersion 同源复用、并存不冲突(纵深防御,防 CP 绕过与竞态窗口)。

func (*Manager) ReapDaemonForDelete

func (m *Manager) ReapDaemonForDelete(uuid string)

ReapDaemonForDelete 在删除实例前强杀该实例的 daemon 进程树并清理遗留的 PID 文件 / socket(FR-310)。

背景(真机缺陷):删除运行中 daemon 实例时,删除流程只杀 wrapper 组随即 RemoveAll 工作目录。 Unix 上被托管的 Java 经 wrapper 的 applyProcAttr 自成进程组(见 daemon.applyProcAttr),杀 wrapper 组够不到它;未死透的 Java 在 RemoveAll 之后继续写 world region 文件,把工作目录重建出来——于是 worker 日志打印「已清理工作目录」(RemoveAll 返回 nil),盘上却残留 world/plugins。此外 wrapper 被 强杀时其 defer cleanupPIDFile 不执行,遗留 <uuid>.pid 与 <uuid>.sock(本机 var/servers 下)。

处置:按 PID 记录强杀 wrapper 与 Java 两棵进程树——Unix 各杀其组,故两棵都要杀;Windows taskkill /T 已覆盖子树,补杀已死 PID 无害——轮询确认死透后再由调用方 RemoveAll,杜绝存活进程回写;确认死透即 清理遗留的 PID 文件与 socket。与 FR-325 接管兜底 reapOrphanWrapper 同源(复用 killTree / waitPIDsGone / pidAlive 桩,便于确定性单测)。

无 PID 文件(非 daemon 实例,或 wrapper 已优雅退出自清理)时为空操作。强杀后仍有存活(权限不足等) 则保留 PID 文件,让后续 Worker 重启的接管扫描 RecoverDaemonInstances 仍能发现并再次兜底,杜绝孤儿 永久失联——此时工作目录可能残留,由调用方 removeInstanceWorkDir 的校验重试如实反映。

func (*Manager) RecoverDaemonInstances

func (m *Manager) RecoverDaemonInstances() (int, error)

RecoverDaemonInstances 在 Worker 重启后扫描 PID 目录,恢复仍存活的 daemon wrapper 连接。 对每个 PID 文件:wrapper pid 存活且 socket 可达则 reconnect 并登记实例为 RUNNING; 否则删除 PID 文件与残留 socket(清理)。返回成功恢复的实例数。 参见 ADR-003: 平台重启后通过 PID 文件重新连接已有 daemon。

func (*Manager) Remove

func (m *Manager) Remove(uuid string) error

Remove 移除实例记录。

func (*Manager) Restart

func (m *Manager) Restart(uuid string) error

Restart 优雅重启实例:运行中先发停止命令让游戏服正常关服(保存世界、释放 world/session.lock、 输出关服日志),等旧进程完全退出后再启动;已停止/崩溃则直接启动。整个过程持有同一实例生命周期锁。

此前用强杀(killLocked)+ 立即启动:daemon 模式强杀 wrapper 进程树时,Unix 上自成进程组的 Java 可能未被杀到而沦为孤儿、仍占 world 锁,新进程随即启动即撞 Paper `SessionLock$ExceptionWorldConflict` (真机复现);且强杀无关服日志、跳过世界保存。改走优雅停止——stopLocked 下发 stop 控制帧由 wrapper 优雅关服(自带超时强杀兜底、复用同一策略);startLocked 内 strategy.Start() 的 daemon.WaitForPriorExit 依 PID 文件等旧 wrapper/Java 全退出(best-effort 上限)再拉起新进程, reapWrapper 的 `d.wrapperCmd != cmd` 陈旧守卫保证旧 reaper 不误改新实例状态。

func (*Manager) SendCommand

func (m *Manager) SendCommand(uuid, command string) error

SendCommand 向实例发送命令(通过 stdin)。

func (*Manager) SetCrashHandler

func (m *Manager) SetCrashHandler(handler func(instanceID string, info CrashInfo))

SetCrashHandler 设置进程非正常退出回调(FR-313)。 各策略在崩溃判定路径(direct/docker waitLoop、daemon 经 wrapper 退出事件)捕获现场后 经此扇出;回调须快速返回(上报本身应异步),不得阻塞策略的崩溃处理。

func (*Manager) SetDockerConfig

func (m *Manager) SetDockerConfig(uuid, image string, mappings []PortMapping, cpuLimit float64, memLimitMB, diskLimitMB int64)

SetDockerConfig 设置已登记实例的 docker 镜像、端口映射与资源限额(ADR-019 / FR-079)。 由 CP 在创建/重注册 docker 实例时下发,使镜像/端口/限额对下一次启动生效(值在 Start 时随 spec 定型)。 实例不存在则忽略(与 SetGracefulStopTimeout 容错风格一致,不阻塞启动路径)。

func (*Manager) SetGracefulStopTimeout

func (m *Manager) SetGracefulStopTimeout(uuid string, seconds int)

SetGracefulStopTimeout 更新已登记实例的优雅停止超时(秒)。 供 CP 在「重新注册已存在实例」时刷新该值,使设置变更对下一次启动生效(值在 Start 时随 spec 定型)。 实例不存在则忽略(与 SetRCONConfig 的容错风格一致,但此处不报错以免阻塞启动路径)。

func (*Manager) SetLaunchConfig

func (m *Manager) SetLaunchConfig(uuid, startCommand, jdkPath, jdkBinPath string, envVars map[string]string, autoRestart bool)

SetLaunchConfig 刷新已存在实例的启动配置,供 CP 幂等重注册时下发(FR-233)。 运行中的策略继续服务且仅标记过期;停止/崩溃态则立即丢弃旧策略,确保下一次启动采用新规格。

func (*Manager) SetMemGuard

func (m *Manager) SetMemGuard(cfg MemGuardConfig)

SetMemGuard 注入内存闸配置(main 从 worker.yml 接线)。

func (*Manager) SetMemReader

func (m *Manager) SetMemReader(r readSysMem)

SetMemReader 注入系统内存读数器(仅测试)。

func (*Manager) SetOutputHandler

func (m *Manager) SetOutputHandler(handler func(instanceID string, stream string, data []byte))

SetOutputHandler 设置进程输出回调。 输出会路由到此处(用于桥接 WebSocket 终端)。

func (*Manager) SetRCONConfig

func (m *Manager) SetRCONConfig(uuid string, port int, password string) error

SetRCONConfig 设置实例的 RCON 配置。

func (*Manager) SetStateChangeHandler

func (m *Manager) SetStateChangeHandler(handler func(instanceUUID string, oldState, newState InstanceState))

SetStateChangeHandler 设置实例状态变更回调。 每次实例状态发生转换时调用,用于 StreamInstanceEvents 推送。

func (*Manager) Start

func (m *Manager) Start(uuid string) error

Start 启动实例。按实例的 ProcessType 选择策略;首次启动时惰性构造策略。

func (*Manager) Stop

func (m *Manager) Stop(uuid string) error

Stop 停止实例。

func (*Manager) StopAll

func (m *Manager) StopAll()

StopAll 停止所有运行中的实例。 direct 模式:终止游戏服进程(Worker 退出时一并清理)。 daemon 模式:仅断开与 wrapper 的连接,wrapper 继续托管游戏服(ADR-003 进程隔离目标)。

type MemGuardConfig

type MemGuardConfig struct {
	// ReserveMB 保留水位(MB);0 = 默认策略 max(512MB, 总内存 10%)。
	ReserveMB int64
	// Disabled 显式关闭守卫(应急逃生口,如误判阻塞关键启动时)。
	Disabled bool
}

MemGuardConfig Worker 实时内存闸配置(FR-317,worker.yml memory_guard 段)。

type PortMapping

type PortMapping struct {
	// ContainerPort 容器内监听端口(由镜像约定,如 MC 容器内 25565)。
	ContainerPort int
	// HostPort 宿主发布端口(来自 FR-032 端口池分配)。
	HostPort int
	// Protocol 端口协议,tcp(默认)或 udp(如 MC query)。
	Protocol string
}

PortMapping 描述一条容器端口到宿主端口的发布关系(docker 模式,ADR-019)。

type PreflightCheckResult

type PreflightCheckResult struct {
	Name    string
	OK      bool
	Message string
}

PreflightCheckResult 单项启动预检结果(FR-314)。

type ProcessType

type ProcessType string

ProcessType 启动方式,与 model.ProcessType 对齐。 这里独立定义为字符串以避免 process 包反向依赖 controlplane/model。

const (
	ProcessTypeDirect ProcessType = "direct"
	ProcessTypeDaemon ProcessType = "daemon"
	ProcessTypeDocker ProcessType = "docker"
	ProcessTypeRCON   ProcessType = "rcon"
)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL