重启游戏服务器后的 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,没有他的帮助我无法得出任何结论。
先决条件
启动
这是我用来启动服务器的脚本。它在名为 '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 和所有其他人花时间提供帮助!
我 运行 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,没有他的帮助我无法得出任何结论。
先决条件
启动
这是我用来启动服务器的脚本。它在名为 '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 和所有其他人花时间提供帮助!