11 10 月 2026

开服最尴尬的事不是服务器崩了,而是崩了三天你才知道——朋友在群里问"服怎么进不去",你才慌慌张张上去看,日志里写着昨晚 11 点就 OOM 了。

这篇解决的问题很具体:用最低成本把"服务器还活着吗"这件事自动化,出问题第一时间收到通知,而不是等玩家来问。

整套方案不依赖任何付费监控服务,一个 shell 脚本 + 一个定时任务就能跑起来,1 核 1G 的小机器也吃得下。


一、先搞清楚要监控什么

新手容易一上来就装 Prometheus + Grafana,结果监控本身比游戏服还吃资源。开服场景真正需要盯的只有 5 个指标:

指标为什么重要告警阈值建议
进程是否存在游戏进程没了 = 服挂了进程不存在即告警
内存占用游戏服最常见的死因是 OOM> 85% 告警
磁盘剩余日志和存档会慢慢吃满盘< 10% 告警
端口是否在监听进程在但端口没起来 = 假活端口不通即告警
CPU 持续满载可能是死循环或被人跑脚本5 分钟均值 > 95% 告警
经验:80% 的开服故障只靠前两项(进程 + 内存)就能提前发现,别把监控做复杂了。

二、Linux:一个脚本搞定进程 + 内存 + 磁盘

第一步:安装依赖

# Debian / Ubuntu
sudo apt update && sudo apt install -y curl

# CentOS / Rocky
sudo yum install -y curl

第二步:写监控脚本

创建 /opt/gameserver/watch.sh:

sudo mkdir -p /opt/gameserver
sudo nano /opt/gameserver/watch.sh

内容如下(按注释改前几行就行):

#!/bin/bash
# ====== 配置区:按你的实际情况改这几行 ======
PROC_NAME="PalServer"          # 游戏进程名,用 pgrep 匹配
GAME_PORT="8211"               # 游戏端口,用于端口探活
MEM_LIMIT=85                   # 内存告警阈值(%)
DISK_LIMIT=10                  # 磁盘剩余告警阈值(%)
PUSH_URL=""                    # 告警推送地址,见第四节;留空则只写日志
LOG_FILE="/var/log/gameserver_watch.log"
# ==========================================

HOSTNAME=$(hostname)
TIME=$(date "+%Y-%m-%d %H:%M:%S")
ALERT=""

# 1. 进程探活
if ! pgrep -f "$PROC_NAME" > /dev/null; then
  ALERT="【严重】游戏进程 $PROC_NAME 已停止运行"
fi

# 2. 端口探活(进程在但端口没监听,属于假活)
if [ -n "$GAME_PORT" ]; then
  if ! (ss -lunu 2>/dev/null | grep -q ":$GAME_PORT") && ! (ss -lntu 2>/dev/null | grep -q ":$GAME_PORT"); then
    ALERT="$ALERT 【严重】端口 $GAME_PORT 未在监听"
  fi
fi

# 3. 内存
MEM_USED=$(free | awk '/Mem:/ {printf("%d", $3/$2*100)}')
if [ "$MEM_USED" -gt "$MEM_LIMIT" ]; then
  ALERT="$ALERT 【警告】内存占用 ${MEM_USED}%(阈值 ${MEM_LIMIT}%)"
fi

# 4. 磁盘
DISK_LEFT=$(df / | awk 'NR==2 {print $5}' | tr -d '%')
DISK_LEFT=$((100 - DISK_LEFT))
if [ "$DISK_LEFT" -lt "$DISK_LIMIT" ]; then
  ALERT="$ALERT 【警告】根分区仅剩 ${DISK_LEFT}% 空间"
fi

# 5. CPU(1 分钟负载 / 核心数,粗判满载)
CORES=$(nproc)
LOAD1=$(awk '{print $1}' /proc/loadavg)
CPU_RATIO=$(awk "BEGIN{printf(\"%d\", $LOAD1/$CORES*100)}")
if [ "$CPU_RATIO" -gt 95 ]; then
  ALERT="$ALERT 【警告】CPU 负载 ${CPU_RATIO}%"
fi

# 输出与推送
if [ -n "$ALERT" ]; then
  MSG="[$TIME] $HOSTNAME $ALERT"
  echo "$MSG" >> "$LOG_FILE"
  if [ -n "$PUSH_URL" ]; then
    curl -sS -m 10 -X POST "$PUSH_URL" \
      -H "Content-Type: application/json" \
      -d "{\"msgtype\":\"text\",\"text\":{\"content\":\"$MSG\"}}" > /dev/null 2>&1
  fi
else
  echo "[$TIME] 正常 | 内存 ${MEM_USED}% | 磁盘剩余 ${DISK_LEFT}% | CPU ${CPU_RATIO}%" >> "$LOG_FILE"
fi

保存后加执行权限:

sudo chmod +x /opt/gameserver/watch.sh

第三步:先手动跑一次验证

sudo /opt/gameserver/watch.sh
cat /var/log/gameserver_watch.log

看到 正常 | 内存 xx% 就说明脚本没问题。如果提示进程不存在,说明 PROC_NAME 写错了,用下面命令查真实进程名:

ps aux | grep -i 游戏名

第四步:加定时任务(每 3 分钟检查一次)

sudo crontab -e

末尾加一行:

*/3 * * * * /opt/gameserver/watch.sh
别设成每分钟。3 分钟一次对开服场景足够,频率太高会被推送平台限流,也徒增日志体积。

三、进阶:进程挂了自动拉起来

监控只是告诉你"挂了",更实用的是自动重启。在上面脚本的第 1 步后面加自动拉起逻辑:

if ! pgrep -f "$PROC_NAME" > /dev/null; then
  ALERT="【严重】游戏进程 $PROC_NAME 已停止,正在尝试自动重启"
  echo "[$TIME] 触发自动重启" >> "$LOG_FILE"
  systemctl restart palworld    # ← 换成你自己的服务名
  sleep 30
  if pgrep -f "$PROC_NAME" > /dev/null; then
    ALERT="$ALERT ...已恢复"
  else
    ALERT="$ALERT ...重启失败,需人工介入"
  fi
fi

前提是你在教程里已经把游戏服配成了 systemd 服务(各游戏教程里都有这一步)。如果还在用 screen 手动跑,建议先补上 systemd,否则没法自动拉起。

避坑:自动重启要防止"重启风暴"——进程因配置错误反复崩溃时会疯狂重启刷爆日志。加个计数锁,10 分钟内重启超过 3 次就不再自动拉起,只告警。

四、告警推送:怎么第一时间收到

脚本里的 PUSH_URL 留空就只写日志。想真正收到通知,有几种低成本方案:

方案 A:钉钉 / 飞书群机器人(推荐,免费)

在钉钉群里添加「自定义机器人」,拿到 Webhook 地址,填进 PUSH_URL。飞书同理,只是 JSON 结构略有不同:

# 飞书格式
-d "{\"msg_type\":\"text\",\"content\":{\"text\":\"$MSG\"}}"

方案 B:Server 酱(微信推送,个人用户友好)

注册后拿到 SendKey,URL 形如:

https://sctapi.ftqq.com/你的KEY.send

推送方式改成 GET:

curl -sS -m 10 "https://sctapi.ftqq.com/$SENDKEY.send?title=服务器告警&desp=$MSG" > /dev/null 2>&1

方案 C:邮件(最稳,不依赖第三方)

sudo apt install -y mailutils
echo "$MSG" | mail -s "游戏服务器告警" your@mail.com
重要提醒:不要在企业微信/钉钉群里把告警内容配上 IP 和端口公开展示,容易被扫段扫描。告警只发给自己或小范围管理员群即可。

五、Windows:任务计划 + 事件日志

Windows 下思路一样,只是工具不同:

方案 A:PowerShell 脚本 + 任务计划程序

保存为 C:\GameServer\watch.ps1:

$proc = "PalServer"
$port = 8211
$memLimit = 85
$log = "C:\GameServer\watch.log"
$time = Get-Date -Format "yyyy-MM-dd HH:mm:ss"

$alive = Get-Process -Name $proc -ErrorAction SilentlyContinue
$listen = Get-NetUDPEndpoint -LocalPort $port -ErrorAction SilentlyContinue

$os = Get-CimInstance Win32_OperatingSystem
$memUsed = [math]::Round(($os.TotalVisibleMemorySize - $os.FreePhysicalMemory) / $os.TotalVisibleMemorySize * 100)

$msg = ""
if (-not $alive) { $msg += "【严重】进程 $proc 已停止 " }
if (-not $listen) { $msg += "【严重】端口 $port 未监听 " }
if ($memUsed -gt $memLimit) { $msg += "【警告】内存占用 $memUsed% " }

if ($msg) {
    "$time $msg" | Out-File -Append -Encoding utf8 $log
    # 自动重启
    if (-not $alive) { Start-Process "C:\GameServer\start_server.bat" }
} else {
    "$time 正常 | 内存 $memUsed%" | Out-File -Append -Encoding utf8 $log
}

然后用任务计划程序新建任务:触发器设为「重复间隔 5 分钟」,操作为 powershell.exe -File C:\GameServer\watch.ps1,并勾选「使用最高权限运行」。

方案 B:直接用 NSSM 的自动重启(最省事)

如果你按《Windows 云服务器开服通用前置教程》用 NSSM 把游戏服注册成了服务,那进程挂了 NSSM 会自动拉起,不需要额外写脚本:

nssm set GameServer AppExit Default Restart
nssm set GameServer AppRestartDelay 10000

这样只需要在内存/磁盘层面做监控即可,进程层面 NSSM 已经包了。


六、日志别把磁盘吃满

监控脚本自身也会产生日志,久而久之会占空间。加个日志轮转:

sudo nano /etc/logrotate.d/gameserver_watch
/var/log/gameserver_watch.log {
    daily
    rotate 7
    compress
    missingok
    notifempty
}

这表示每天轮转一次,保留 7 天,自动压缩。


七、常见问题

Q:脚本提示 ss: command not found?
A:装 iproute2:sudo apt install -y iproute2。或者改用 netstat,需装 net-tools。

Q:内存明明还有一半,进程却被杀了?
A:这是 Linux 的 OOM Killer 干的,通常是某个进程瞬间申请大内存触发,看 dmesg | grep -i oom。解决办法是给游戏进程限制内存上限,或加 swap:

sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile && sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

Q:告警太多,天天收到消息烦死了?
A:把阈值调宽(内存 85 → 92),并且区分等级——只有「进程停止」「端口不通」这类严重项才推送,内存警告只写日志。

Q:我想看历史趋势图怎么办?
A:开服场景一般不需要。真要的话,轻量方案是 netdata(一行命令安装,自带 Web 面板,约 100MB 内存开销),但小机器上不建议和游戏服抢资源。


八、总结

开服监控的最小可行方案就是:一个 shell 脚本 + 一个 cron + 一个推送 Webhook,20 分钟就能搭好,能挡掉绝大多数"服挂了没人知道"的尴尬。

优先级建议:

  1. 先做进程探活 + 自动重启(收益最大,NSSM/systemd 自带)
  2. 再做内存和磁盘告警(防半夜 OOM 和磁盘写满)
  3. 最后才考虑趋势面板(非必需)
📌 觉得有用请收藏。需要长期挂服、又不想半夜爬起来重启的朋友,可以看看我们家的一键开服面板,自带进程守护和异常通知 → https://z0w.cn

相关教程

延伸阅读
  1. 网站环境怎么选:LNMP 手动 / 宝塔面板 / Docker / 云开发
  2. 问卷表单系统搭建:SurveyKing / Formbricks,数据自己收
  3. 图床搭建:Lsky Pro / Lychee,自托管图片托管方案
  4. 邮件列表搭建:listmonk 自托管 Newsletter,把读者握在自己手里
  5. 文档站点搭建:MkDocs / VuePress / Docsify,产品文档与技术手册方案
  6. RSS 阅读器搭建:FreshRSS 自托管,把信息流拿回自己手里
  7. 短链接服务搭建:Shlink 自托管,链接数据自己掌握
  8. 网站状态监控页搭建:Uptime Kuma,服务器挂了第一时间知道
更多阅读
  1. 上一篇:异星工厂Factorio开服保姆级教程(Linux版):官方headless服务端
  2. 下一篇:Docker部署游戏服务器保姆级教程:一个命令起服,多服互不干扰
发表评论 6

取消回复

    1. 开服常见报错与解决手册:端口、内存、存档、网络全排查 - 			财富云计算 - 维基百科的头像

      [...]# 3. 搜索:报错关键信息 + 游戏名,英文搜比中文搜命中率高日志看不懂就整段丢给搜索引擎或 AI,报错信息本身往往就是解决方案。六、防崩服运维清单[ ] systemd 托管服务端,崩溃自动重启(Restart=always)[ ] 每日自动备份存档(rsync 硬链接,见备份实战)[ ] Swap 分区备好,小内存机器的保险丝[ ] 磁盘使用率 >80% 告警[ ] 端口放行 UDP [...]

    2. Steam 开服游戏配置天梯总表:一页查清你的游戏要吃多少配置 - 			财富云计算 - 维基百科的头像

      [...]「我想开的服到底要什么配置?」——这是被问得最多的问题,也是买服务器前最后一道坎。买小了卡顿掉线,买大了白白浪费。这篇把全站覆盖的 Steam 开服游戏按资源需求排成天梯,从「有手就行」到「钱包噩梦」一共五档。每款游戏给出 CPU / 内存 / 带宽 / 磁盘四项硬指标和推荐档位,买服务器前查这一页就够。本文数据基于 财富云计算 NAT 型云服务器(无独立公网 IP,价格比独立 IP 机型省一半以[...]

    3. 幻兽帕鲁开服配置实测:2核8G能带几人,4核16G爽在哪 - 			财富云计算 - 维基百科的头像

      [...]帕鲁是这两年最现象级的开服游戏,也是最容易被配置坑的游戏——官方推荐配置和实际体验差着一条街。这篇用实测数据回答三个问题:最低什么配置能开、多少人开始卡、该买哪一档。测试环境:财富云计算 NAT 型云服务器(无独立公网 IP,价格比独立 IP 机型省一半以上),系统 Ubuntu 22.04 / Windows Server 2022 双测,存档为开服 30 天后的中期档(玩家基地 20+、捕获帕[...]

    4. RUST 腐蚀配置实测:配置黑洞名不虚传,多少预算才不卡 - 			财富云计算 - 维基百科的头像

      [...]# 4. 定期重启清内存:每周一次,维护公告配合着发四、带宽与磁盘:RUST 的两个大坑项目建议原因带宽20-30M 固定30 人在线约 10-20M;进服下载 + 地图加载会打满磁盘100G+RUST 存档月涨 3-8G,地图 + 备份双份快照wipe 前必做wipe 前的存档是玩家财产,务必留存RUST 特有的坑:Oxide/uMod 插件包。装了 Mod 的服,玩家进服要下载插件资源,新玩家[...]

    5. top 命令高级用法:不止看内存占用,这么读才专业 - 			财富云计算 - 维基百科的头像

      [...]MiB Swap: 4096 total, 1024 free, 3072 used. 6501 avail现象诊断对策free 少,buff/cache 高,Swap used ≈ 0健康。Linux 把空闲内存拿来做缓存是本能,不是内存不足不用管Swap used 持续增长物理内存真的不够加 Swap(Swap 优化)或加内存Swap used 高 + wa 高内存在换页,磁盘[...]

    6. Steam 游戏配置与开服教程总索引:一页查清要吃多少配置、教程在哪 - 			财富云计算 - 维基百科的头像

      [...]这是本站长期维护的游戏配置与教程总索引。想开服,先在这页搞清楚两件事:你的游戏要吃多少配置、你的系统该看哪篇教程。建议收藏——换游戏、加 MOD、人数变多时,回来核对一遍能省掉大部分"卡爆了"和"连不上"。搭配阅读:还没买服务器?先看购前决策索引(预算分级 / NAT vs 独立 IP / 避坑清单);端口映射看不懂?先看端口速查表(40+ 游戏端口协议一页查清)。一、全游戏配置需求速查表下表按"[...]