开服最尴尬的事不是服务器崩了,而是崩了三天你才知道——朋友在群里问"服怎么进不去",你才慌慌张张上去看,日志里写着昨晚 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/fstabQ:告警太多,天天收到消息烦死了?
A:把阈值调宽(内存 85 → 92),并且区分等级——只有「进程停止」「端口不通」这类严重项才推送,内存警告只写日志。
Q:我想看历史趋势图怎么办?
A:开服场景一般不需要。真要的话,轻量方案是 netdata(一行命令安装,自带 Web 面板,约 100MB 内存开销),但小机器上不建议和游戏服抢资源。
八、总结
开服监控的最小可行方案就是:一个 shell 脚本 + 一个 cron + 一个推送 Webhook,20 分钟就能搭好,能挡掉绝大多数"服挂了没人知道"的尴尬。
优先级建议:
- 先做进程探活 + 自动重启(收益最大,NSSM/systemd 自带)
- 再做内存和磁盘告警(防半夜 OOM 和磁盘写满)
- 最后才考虑趋势面板(非必需)
📌 觉得有用请收藏。需要长期挂服、又不想半夜爬起来重启的朋友,可以看看我们家的一键开服面板,自带进程守护和异常通知 → https://z0w.cn
相关教程
延伸阅读
- 网站环境怎么选:LNMP 手动 / 宝塔面板 / Docker / 云开发
- 问卷表单系统搭建:SurveyKing / Formbricks,数据自己收
- 图床搭建:Lsky Pro / Lychee,自托管图片托管方案
- 邮件列表搭建:listmonk 自托管 Newsletter,把读者握在自己手里
- 文档站点搭建:MkDocs / VuePress / Docsify,产品文档与技术手册方案
- RSS 阅读器搭建:FreshRSS 自托管,把信息流拿回自己手里
- 短链接服务搭建:Shlink 自托管,链接数据自己掌握
- 网站状态监控页搭建:Uptime Kuma,服务器挂了第一时间知道

[...]# 3. 搜索:报错关键信息 + 游戏名,英文搜比中文搜命中率高日志看不懂就整段丢给搜索引擎或 AI,报错信息本身往往就是解决方案。六、防崩服运维清单[ ] systemd 托管服务端,崩溃自动重启(Restart=always)[ ] 每日自动备份存档(rsync 硬链接,见备份实战)[ ] Swap 分区备好,小内存机器的保险丝[ ] 磁盘使用率 >80% 告警[ ] 端口放行 UDP [...]
2026-10-14 回复
[...]「我想开的服到底要什么配置?」——这是被问得最多的问题,也是买服务器前最后一道坎。买小了卡顿掉线,买大了白白浪费。这篇把全站覆盖的 Steam 开服游戏按资源需求排成天梯,从「有手就行」到「钱包噩梦」一共五档。每款游戏给出 CPU / 内存 / 带宽 / 磁盘四项硬指标和推荐档位,买服务器前查这一页就够。本文数据基于 财富云计算 NAT 型云服务器(无独立公网 IP,价格比独立 IP 机型省一半以[...]
2026-10-18 回复
[...]帕鲁是这两年最现象级的开服游戏,也是最容易被配置坑的游戏——官方推荐配置和实际体验差着一条街。这篇用实测数据回答三个问题:最低什么配置能开、多少人开始卡、该买哪一档。测试环境:财富云计算 NAT 型云服务器(无独立公网 IP,价格比独立 IP 机型省一半以上),系统 Ubuntu 22.04 / Windows Server 2022 双测,存档为开服 30 天后的中期档(玩家基地 20+、捕获帕[...]
2026-10-18 回复
[...]# 4. 定期重启清内存:每周一次,维护公告配合着发四、带宽与磁盘:RUST 的两个大坑项目建议原因带宽20-30M 固定30 人在线约 10-20M;进服下载 + 地图加载会打满磁盘100G+RUST 存档月涨 3-8G,地图 + 备份双份快照wipe 前必做wipe 前的存档是玩家财产,务必留存RUST 特有的坑:Oxide/uMod 插件包。装了 Mod 的服,玩家进服要下载插件资源,新玩家[...]
2026-10-18 回复
[...]MiB Swap: 4096 total, 1024 free, 3072 used. 6501 avail现象诊断对策free 少,buff/cache 高,Swap used ≈ 0健康。Linux 把空闲内存拿来做缓存是本能,不是内存不足不用管Swap used 持续增长物理内存真的不够加 Swap(Swap 优化)或加内存Swap used 高 + wa 高内存在换页,磁盘[...]
2026-10-18 回复
[...]这是本站长期维护的游戏配置与教程总索引。想开服,先在这页搞清楚两件事:你的游戏要吃多少配置、你的系统该看哪篇教程。建议收藏——换游戏、加 MOD、人数变多时,回来核对一遍能省掉大部分"卡爆了"和"连不上"。搭配阅读:还没买服务器?先看购前决策索引(预算分级 / NAT vs 独立 IP / 避坑清单);端口映射看不懂?先看端口速查表(40+ 游戏端口协议一页查清)。一、全游戏配置需求速查表下表按"[...]
2026-10-18 回复