如何在 Ubuntu 18.04 上为 Minecraft 基岩服务器创建服务脚本?

use*_*825 5 service ubuntu-18.04

我已经设置了一个 Ubuntu 18.04 实例,用作私有 Minecraft Bedrock 服务器。

我已经从https://www.minecraft.net/en-us/download/server/bedrock/下载了服务器本身

我可以直接从 shell 运行它,一切正常。然而,我想做的是将其配置为服务,这样它将在启动时自动启动,并优雅地停止等。

“bedrock_server”可执行文件在前台运行,并等待来自标准输入的各种命令,例如“stop”、“kick”、“save”等。

有没有一种方法可以配置服务脚本,以便可以像这样控制它......

$ service minecraft stop
$ service minecraft restart
Run Code Online (Sandbox Code Playgroud)

如果我还可以发出其他特定于《我的世界》的命令,那就更好了,例如......

$ service minecraft kick [player name or xuid]
Run Code Online (Sandbox Code Playgroud)

ETC。

不过我不太关心这种能力。我想要的主要事情是能够在服务器启动时正确启动它,并优雅地停止。

我不需要为我完整地写下它。如果有人可以指导我查看教程、模板或其他东西,那就太好了。

这是我当前用来从 shell 启动它的完整命令......

$ cd /home/[my-user]/bedrock-server-1.14.60.5 && LD_LIBRARY_PATH=. ./bedrock_server
Run Code Online (Sandbox Code Playgroud)

更新...

根据下面的答案以及大量的试验和错误,我想出了这个 systemd 脚本......

[Unit]
Description=Minecraft Bedrock Service
After=network-online.target

[Service]
User=[my-user]
WorkingDirectory=/home/[my-user]/bedrock-server-1.14.60.5
Type=forking
ExecStart=/usr/bin/screen -dmS UbuntuMinecraft /bin/bash -c "LD_LIBRARY_PATH=. ./bedrock_server"
ExecStop=/usr/bin/screen -Rd UbuntuMinecraft -X stuff "say Stopping server in 10 seconds...\r"
ExecStop=/bin/sleep 10
ExecStop=/usr/bin/screen -Rd UbuntuMinecraft -X stuff "stop\r"
GuessMainPID=no
TimeoutStartSec=600

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

这看起来效果很好。

如果我需要在服务器上运行其他命令,我可以像这样连接到屏幕会话......

$ screen -R UbuntuMinecraft
Run Code Online (Sandbox Code Playgroud)

然后我可以运行我需要的任何本机命令。

我的解决方案部分基于此代码... https://github.com/TheRemote/MinecraftBedrockServer

KHo*_*its 6

初始化脚本根据您使用的发行版版本而有所不同,但我相信大多数现代版本的 Ubuntu 都使用 systemd。那么您可能想要一个Systemd 文件

Systemd 文件遵循标准格式,您主要必须在其中替换正确的值。

我还没有对此进行测试,但是按照标准语法,您需要以下内容:

[Unit]
Description=Minecraft Service
After=network.target

[Service]
Type=Simple
WorkingDirectory=/home/user/bedrock-server-1.14.60.5
ExecStart=/bin/sh -c "LD_LIBRARY_PATH=. ./bedrock_server"
Restart=on-failure

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

您可以在此处配置不同的内容,例如,TimeoutStopSec您可以配置当您运行“stop”命令时,服务在终止进程之前要关闭的时间。

如果您将该文件放入您的发行版的正确文件夹(/etc/systemd/system)中,您将能够使用 systemctl 或 service 命令来控制该服务。

如果您创建了名为“minecraft”的服务,您将能够使用如下命令:

systemctl status minecraft- 获取当前状态
systemctl starts minecraft- 启动服务
systemctl stop minecraft- 停止服务
systemctl enable minecraft- 启动时启动该服务

至于能否运行控制台命令,取决于服务的处理方式。当我过去运行 Java Minecraft 服务器时,您可以使用“RCON”将命令发送到控制台,但还有其他技巧,例如绑定到套接字。

我无法保证这段代码的安全性,但快速谷歌暗示有人已经为此类功能创建了正确的套接字包装器: https: //github.com/TapeWerm/MCscripts

另一种选择是在屏幕会话中启动 Minecraft,这将允许您随意重新连接到正在运行的控制台。