Minecraft 服务器在崩溃或停止时不会停止 JVM

Minecraft 服务器在崩溃或停止时不会停止 JVM

我面临以下问题:

Minecraft Forge Modded Server 1.15.2 正在我的 Debian 10 VM 上运行,该 VM 运行 OpenJDK JAVA 1.8.0_275-8u275-b01-1-b01。由于Modpack的不稳定,服务器有时会崩溃。

我尝试过 Stackoverflow 的解决方案:https://stackoverflow.com/questions/62143022/how-do-i-automatically-restart-a-minecraft-spigot-server-in-the-event-of-a-crash 但不幸的是,这对我不起作用。

我面临的问题是,如果 Minecraft 服务器停止或崩溃,服务器会停止,但 JVM 仍在运行。导致无法从进程中获取退出代码...当前服务器正在启动,如上面的链接所示。即使我在 Windows 计算机上,也会遇到相同的行为。服务器停止,但 JVM 继续运行。 CMD 和 Powershell。

Windows 10 上的进程资源管理器

到目前为止我找不到任何有用的东西。

谢谢,DaNeubi

答案1

通常,您将根据退出代码重新启动。但如果应用程序挂起,那么您需要采取更严厉的措施。

从概念上讲,您的脚本需要了解您打算停止服务器。这可能涉及解析/stop命令的标准输出,或更简单地说systemctl stop minecraft

当您的脚本了解您打算停止时,它应该等待一段合理的时间,以便应用程序正常关闭。当该时间到期时,这意味着应用程序已挂起,因此您需要发送更积极的消息信号例如 SIGKILL 强制应用程序停止。

实际上,实施起来可能有点困难screen。但如果你用它systemd来管理你的《我的世界》服务器,这很容易。

这个答案用于管理 Minecraft 服务器的实现systemd。特别注意Restart=:

[System]
Restart=on-failure

这意味着如果服务失败,它将自动重新启动。您可能还想尝试Restart=always哪个会导致它启动,即使它以干净的退出代码停止。

此外,systemd 提供了这些默认值,您可以通过将它们添加到您的服务并根据需要进行修改来自定义这些默认值:

[Service]
TimeoutStopSec=90s
KillSignal=SIGTERM
FinalKillSignal=SIGKILL

如果您尝试这样做,systemctl stop或者systemctl restart没有任何反应,systemd 将等待 90 秒以正常退出,然后再销毁该进程。可以通过更改上面的数字来修改默认的时间和信号。

systemctl restart minecraft当然,所有这些都假设您在想要重新启动服务器时发送(或您编写的脚本发送) 。它不会检测服务器在游戏过程中是否冻结。

相关内容