Менеджер запускает сервер PZ как дочерний процесс и держит его stdin/stdout: отсюда живая консоль без RCON, стриминг логов через SSE и корректная остановка по цепочке quit -> SIGTERM -> SIGKILL для всей группы процессов. Сам менеджер работает под systemd. Что входит: - управление жизненным циклом сервера, автозапуск и автоподъём после падения; - метрики процесса из /proc и состояние хоста, список игроков онлайн; - редакторы servertest.ini и SandboxVars.lua, сохраняющие исходное форматирование файлов; - моды: списки Workshop ID и Mod ID с порядком загрузки, названия из Steam; - бэкапы мира по расписанию и вручную, с ротацией и восстановлением; - установка и обновление сервера через SteamCMD; - вход по логину и паролю, первичная настройка по одноразовому коду. Веб-интерфейс без сборщика, вшит в бинарник через embed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
43 lines
1.9 KiB
Go
43 lines
1.9 KiB
Go
// Package sysinfo снимает метрики хоста и группы процессов игрового сервера.
|
|
package sysinfo
|
|
|
|
import "sync"
|
|
|
|
// ProcStats — потребление ресурсов одной группой процессов.
|
|
type ProcStats struct {
|
|
// CPUPercent — доля CPU за интервал между двумя снимками; 100% = одно ядро.
|
|
CPUPercent float64 `json:"cpu_percent"`
|
|
// RSSBytes — резидентная память всех процессов группы.
|
|
RSSBytes int64 `json:"rss_bytes"`
|
|
// Threads — суммарное число потоков.
|
|
Threads int `json:"threads"`
|
|
}
|
|
|
|
// HostStats — общее состояние машины.
|
|
type HostStats struct {
|
|
MemTotalBytes int64 `json:"mem_total_bytes"`
|
|
MemAvailableBytes int64 `json:"mem_available_bytes"`
|
|
Load1 float64 `json:"load1"`
|
|
CPUCount int `json:"cpu_count"`
|
|
DiskTotalBytes int64 `json:"disk_total_bytes"`
|
|
DiskFreeBytes int64 `json:"disk_free_bytes"`
|
|
}
|
|
|
|
// Sampler считает CPU по разнице между вызовами, поэтому хранит прошлый снимок.
|
|
type Sampler struct {
|
|
mu sync.Mutex
|
|
lastCPU float64 // накопленное CPU-время группы, секунды
|
|
lastWall float64 // момент снятия, секунды монотонных часов
|
|
}
|
|
|
|
// NewSampler создаёт счётчик метрик для одной группы процессов.
|
|
func NewSampler() *Sampler { return &Sampler{} }
|
|
|
|
// Reset забывает предыдущий снимок — вызывается при перезапуске сервера,
|
|
// иначе первый замер нового процесса посчитается от чужой базы.
|
|
func (s *Sampler) Reset() {
|
|
s.mu.Lock()
|
|
s.lastCPU, s.lastWall = 0, 0
|
|
s.mu.Unlock()
|
|
}
|