我已经设置了一个 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,这将允许您随意重新连接到正在运行的控制台。