保持游戏服务器永久在线 Restarter¶
Keywords:
此文档介绍了当你用 Linux (最好是 Ubuntu) 来部署服务器时, 如何保持服务器 24 小时在线的方法.
挑战¶
在本地单机上你的机器不可能 24 小时开机, 而且你有可能误操作关闭了游戏服务器命令行窗口.
对于云端部署的情况你通常是用 SSH 连接到远程服务器上然后运行的 authserver / worldserver, 一旦你的 SSH 断开, 远端运行的服务也会断开. 就算你在本地将 SSH 窗口保持不断开, 但你本地机器总是有可能要关机的 (参考 1).
游戏服务器 authserver / worldserver 进程有可能会挂掉, 你不可能每次挂掉就立刻 SSH 到服务器上重启.
GNU screen 工具¶
Screen 是一个命令行工具. 它提供了从多个终端窗口连接到同一个 shell 会话 (会话共享). 当网络中断, 或终端窗口意外关闭是, 中 screen 中运行的程序任然可以运行. 相比之下当系统自带的终端窗口意外关闭时, 在该终端窗口中运行的程序也会终止.
从逻辑上 Screen 相当于能把任何脚本, 命令转为后台运行, 并且允许你随时切换到这个后台运行的 session, 也就是你用起来跟你在 shell 里一样, 但实际上它还在后台. 不过 Screen 的实现原理跟 System Service 完全不一样, 它也不要求你的程序要符合 Service 的标准.
检查 Screen 的版本:
screen --version
参考资料:
GNU Screen 官网: https://www.gnu.org/software/screen/manual/screen.html
解决方案¶
先找到你构建的 Azeroth Server 的位置. cd
到 bin
目录.
然后在该目录下创建 4 个文件, 创建的时候请读一下里面的内容:
auth.sh
: 用于每 20 秒一次如果检测到 authserver 挂了就自动重启world.sh
: 用于每 20 秒一次如果检测到 worldserver 挂了就自动重启restarter.sh
: 用 screen 命令对auth.sh
,world.sh
进行封装, 将这两脚本以 screen session 的方式再后台运行.shutdown.sh
: 检测运行中的 screen session, 如果找到了就将其杀死
#!/bin/sh
# the ./authserver also can be the absolute path to your authserver
while :; do
./authserver
sleep 20
done
#!/bin/sh
# the ./worldserver also can be the absolute path to your worldserver
while :; do
./worldserver
sleep 20
done
#!/bin/bash
screen -AmdS auth ./auth.sh
screen -AmdS world ./world.sh
#!/bin/bash
screen -X -S "world" quit
screen -X -S "auth" quit
你可以用任何终端文本编辑器来创建这些脚本, 比如 vim 或者 nano.
默认情况下创建的脚本只能被创建者 (也就是你) 执行. 而我们需要让 restarter.sh
去调用 auth.sh
就不行了. 你需要打 chmod +x auth.sh
, chmod +x world.sh
将这两个脚本变成可执行的. 不然 restarter.sh
能够被成功运行, 但实际上没有成功 (后面的 auth / world 服务器没有被运行)
管理服务器¶
启动服务器, 但没有 world console 界面:
./restarter.sh
进入 world console session 界面, 如果你按 ctrl + d 退出, 那么这个 session 就被杀死了, 你可以按下 Ctrl + A, 然后按 D (按下 Ctrl + A 之后系统不会给你任何反馈, 你就按 D 就好了) 这样 session 还在:
screen -r world
启动服务器并且进入 world console session 界面:
./restarter.sh; screen -r world
关闭服务器:
./shutdown.sh
参考资料:
AzerothCore 项目的服务器自动重启脚本教程: https://www.azerothcore.org/wiki/linux-restarter