如何在 Ubuntu 18.04 上为 minecraft bedrock 服务器创建服务脚本?

如何在 Ubuntu 18.04 上为 minecraft bedrock 服务器创建服务脚本?

我已经设置了一个 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

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

$ service minecraft kick [player name or xuid]

ETC。

不过我不太关心这个功能。我主要想要的是能够在服务器启动时正确启动它,并正常停止。

我不需要有人为我写完整个教程。如果有人能给我提供教程、模板或类似的东西,那就太好了。

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

$ cd /home/[my-user]/bedrock-server-1.14.60.5 && LD_LIBRARY_PATH=. ./bedrock_server

更新...

根据以下答案以及大量的反复试验,我得出了这个 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

看来效果很好。

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

$ screen -R UbuntuMinecraft

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

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

答案1

初始化脚本因您使用的发行版版本而异,但我相信大多数现代版本的 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

您可以在此处配置不同的东西,例如,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,这将允许您随意重新连接到正在运行的控制台。

相关内容