如何为具有 start.sh 文件的 Minecraft 服务器创建启动服务?

如何为具有 start.sh 文件的 Minecraft 服务器创建启动服务?

我在 Ubuntu Server 上安装了一个经过修改的 FTB 服务器,创建了一个名为“ftb”的用户和组,并为其提供了自己的目录,/opt/ftb/其中包含一个包含服务器文件的文件夹。在服务器文件夹中,有一个 start.sh 文件用于启动服务器。如何创建系统服务文件以便使用诸如 、 和 之类的命令systemctl status ftbacademy.servicesystemctl start ftbacademy.servicesystemctl stop ftbacademy.service停止服务器时,我希望它保存然后关闭服务器。.service 文件是什么样子的?我知道它必须放在 中/etc/systemd/system/,但我不知道如何编写文件,让 ftb 用户打开自己的虚拟终端或其他任何东西,以便能够拯救世界,然后停止服务器。

Ubuntu 服务器版本 20.04.3

FTB Academy 1.16 服务器文件下载站点:https://feed-the-beast.com/modpacks/88/server/2077我选择了 Linux 下载选项,然后运行安装文件以自动下载服务器文件。

我还使用不同版本的 JDK 来运行服务器文件,因此我将 start.sh 文件更改为:

#!/bin/bash
if ! grep -q "eula=true" eula.txt; then
    echo "Do you agree to the Mojang EULA available at https://account.mojang.com/documents/minecraft_eula ?"
    read -N 1 -p "[y/n] " EULA
    if [ "$EULA" = "y" ]; then
        echo "eula=true" > eula.txt
        echo
    fi
fi
/usr/lib/jvm/java-11-openjdk-amd64/bin/java -javaagent:log4jfix/Log4jPatcher-1.0.0.jar -XX:+UseG1GC -XX:+UnlockExperimentalVMOptions -Xmx5000M -Xms4000M -jar forge-1.16.5-36.2.2.jar nogui

答案1

[email protected]我在位置创建了一个名为 的文件/etc/systemd/system/。该文件包含以下内容:

[Unit]
Description=FTB Server: %i
After=network.target

[Service]
WorkingDirectory=/opt/ftb/%i

User=ftb
Group=ftb

Restart=always

ExecStart=/usr/bin/screen -DmS mc-%i bash start.sh

ExecStop=/usr/bin/screen -p 0 -S mc-%i -X eval 'stuff "say SERVER SHUTTING DOWN IN 15 SECONDS..."\015'
ExecStop=/bin/sleep 5
ExecStop=/usr/bin/screen -p 0 -S mc-%i -X eval 'stuff "say SERVER SHUTTING DOWN IN 10 SECONDS..."\015'
ExecStop=/bin/sleep 5
ExecStop=/usr/bin/screen -p 0 -S mc-%i -X eval 'stuff "say SERVER SHUTTING DOWN IN 5 SECONDS..."\015'
ExecStop=/bin/sleep 5
ExecStop=/usr/bin/screen -p 0 -S mc-%i -X eval 'stuff "save-all"\015'
ExecStop=/usr/bin/screen -p 0 -S mc-%i -X eval 'stuff "stop"\015'

[Install]
WantedBy=multi-user.target

然后我使用systemctl enable ftb@academysystemctl start ftb@academy启用并启动服务器。我还意识到,当我最初创建 ftb 用户并授予其文件夹所有权时,我没有授予其子文件夹的权限,因此它被拒绝启动服务器的权限。

答案2

请注意脚本中 EULA 的 URL。它所做的只是询问您是否已阅读其条款,并询问您是否接受,但前提是尚未询问您并回答是。

因此,第一次运行后,它将只执行顶行和底行。

最简单的设置方法(从长远来看可以节省时间)是在最后一行添加命令的别名,该命令实际上配置并启动服务器文件。可以使用以下命令完成此操作:

MC_CMD='alias start_srvr="/usr/lib/jvm/java-11-openjdk-amd64/bin/java -javaagent:log4jfix/Log4jPatcher-1.0.0.jar -XX:+UseG1GC -XX:+UnlockExperimentalVMOptions -Xmx5000M -Xms4000M -jar forge-1.16.5-36.2.2.jar nogui"' && echo "${MC_CMD}" >> ~/.bash_aliases || echo "${MC_CMD}" >> ~/.bashrc

运行我上面添加的命令只是稍微方便了一点,所以您不必担心添加脚本,否则PATH每次要启动服务器时都必须计算相对路径或输入完整路径。

如果您决定删除该服务器,您可以通过编辑~/.bash_aliases并删除包含该命令的单行来删除该“命令”。

相关内容