重启游戏服务器后的 Ghost Java 进程

Ghost Java process after restarting a game server

我 运行 ubuntu 机器上的小型私人服务器。它对我和我的几个朋友全天候开放,但我也用它来学习一些关于管理此类游戏服务器的知识。

我想每天重新启动它以释放一些资源并让进程重置。我使用一个插件来 运行 一个命令 or/and 一个用于重新启动进程的脚本。插件停止当前进程,运行使用下面的脚本重新启动它。

#!/bin/sh
while true
do
java -Xmmx16384M -Xms16384M -jar paper-1.18.1-108.jar nogui
sleep 30
done

进程停止正常,问题是脚本启动的新进程不在同一个终端中 运行。系统监视器显示进程 运行ning,确保您可以正常加入服务器。当我想使用服务器终端时出现问题,因为它无处可寻。使用屏幕也无济于事,屏幕会话在原始 java 停止的地方停止,但进程开始在其他地方运行。

我的问题是有什么方法可以 'tap into' 新进程,以便能够向其中输入命令。

或者我正在做一些错误的事情,我应该在类似的事情上自学,如果是这样的话,你能给我提供资源吗?

解决孤立进程

对于后台中任何完全分离的进程 运行,您可以使用 kill <pid>,其中 <pid> 是相关进程的 PID。如果您不确定要杀死什么,只需重新启动即可。

理想情况下,您需要像 reboot.sh.

这样的单个脚本

重启脚本

首先,它应该停止服务器。然后,您需要使用其 PID 等待它关闭。终于可以重新开始啦

这是一个脚本(来自内存):

#!/bin/sh
# Needed to allow for relative paths.
cd <pathToServerFiles>
# Send the stop command to the server.
screen -S <nameOfScreen> -p 0 -X stuff "stop^M" # '^M' stands for ENTER key.
# Wait for the server to stop properly.
while screen -ls | grep -q <nameOfScreen>
do
    sleep 1
done
# Start a new screen executing the java command on the server JAR.
screen -dmS <nameOfScreen> java -Xmmx16384M -Xms16384M -jar paper-1.18.1-108.jar nogui

安排任务

然后您可以使用 crontab -e(默认包含在 Ubuntu 上)设置每日任务,例如此后每天凌晨 3 点执行脚本:

0 3 * * * <pathToServerFiles>/restart.sh

为了处理硬件重启(毫无疑问是更新所必需的),您甚至可以添加到您的 crontab:

@reboot screen -dmS <nameOfScreen> java -Xmmx16384M -Xms16384M -jar <pathToServerFiles>/paper-1.18.1-108.jar nogui

使用屏幕基本命令

然后您可以使用以下命令启动您的服务器:

screen -dmS <nameOfScreen> java -Xmmx16384M -Xms16384M -jar <pathToServerFiles>/paper-1.18.1-108.jar nogui

查看您的日志:

screen -r <nameOfScreen>

(使用 Ctrl+A 然后 Ctrl+D 可以在不杀死屏幕的情况下脱离屏幕)

检查哪些屏幕是 运行:

screen -ls

日志记录

据我所知,Minecraft 服务器有一个日志文件夹,您可以在该文件夹下找到实时复制的控制台输出,因此这不需要在屏幕上单独显示一个选项(它存在,但有两个相似的日志文件似乎不是你想要达到的目标。

备注

每个用 <> 组合的字符串都应该根据您的上下文更改为适当的值。

让我知道这是否对您有帮助以及您是否需要 details/changes。

结论

对于可能遇到类似问题的任何人来说,这是我设法解决的解决方案。非常感谢@cfgn,没有他的帮助我无法得出任何结论。

先决条件

  • 确保您的驱动器已安装,您可以在系统启动时自动安装驱动器,如图所示here
  • 确保屏幕已安装,可以找到屏幕教程here
  • 确保您创建的所有 .sh 文件都是 'executable'.

启动

这是我用来启动服务器的脚本。它在名为 'minecraft' 的新屏幕中执行 java -Xmx14336M -Xms14336M -jar paper-1.18.1-108.jar nogui 命令,然后从该屏幕分离。如果您使用 screen -r minecraft,您将能够看到控制台并与之交互。

#!/bin/sh
#launches the server process in a detached screen session
screen -dmS minecraft java -Xmx14336M -Xms14336M -jar paper-1.18.1-108.jar nogui

正在重启

这是重启脚本本身,里面的所有注释都很好地解释了每一行的作用。总而言之,您会看到服务器停止,当它完成关闭时,屏幕会话将关闭(有时这些会话会变成 'dead' 这就是最后 screen -wipe 行的用途)。 10 秒后,将使用相同的参数启动一个具有相同名称(但很可能是不同的 PID)的新屏幕会话。

#!/bin/sh
#stops the server via the /stop command
screen -dmS minecraft -p 0 -X stuff stop^M
#waits 10 seconds for the server to close and -cool down-
sleep 10
#launches the server again
screen -dmS minecraft java -Xmx14336M -Xms14336M -jar paper-1.18.1-108.jar nogui
#wipes dead screens if such get left over
screen -wipe

最后的想法

  • 重要的是给文件起一个容易识别的名字。
  • 如果您正在使用 spigot(如果您很可能在此处),则需要更新 spigot.yml 以反映更改。在设置下重启脚本应该看起来像 restart-script: ./restart.sh 如果你的脚本被命名为 'restart.sh'.

再次非常感谢 cfgn 和所有其他人花时间提供帮助!