Как создать службу автозагрузки для сервера Minecraft, у которого есть файл start.sh?

Как создать службу автозагрузки для сервера Minecraft, у которого есть файл start.sh?

Я установил модифицированный сервер FTB на свой сервер Ubuntu, создал пользователя и группу под названием «ftb» и выделил ему собственный каталог, /opt/ftb/содержащий папку с файлами сервера. В папке сервера есть файл start.sh для запуска сервера. Как мне создать файл системной службы, чтобы я мог использовать такие команды, как systemctl status ftbacademy.service, systemctl start ftbacademy.service, и systemctl stop ftbacademy.service. После остановки сервера я хочу, чтобы он сохранял и затем закрывал сервер. Как будет выглядеть файл .service? Я знаю, что его нужно поместить в /etc/systemd/system/, но я не знаю, как написать файл, который заставит пользователя ftb открыть свой собственный виртуальный терминал или что-то еще, чтобы иметь возможность спасти мир, а затем остановить сервер.

Ubuntu Server версии 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@academyи systemctl start ftb@academyдля включения и запуска сервера. Я также понял, что когда я изначально создал пользователя ftb и дал ему право владения папкой, я не дал ему разрешения на подпапки, поэтому ему было отказано в разрешении на запуск сервера.

решение2

Обратите внимание на URL для EULA в скрипте. Все, что он делает, это спрашивает, прочитали ли вы его условия, и принимаете ли вы их, но только если вас еще не спрашивали и не ответили «да».

Поэтому после первого запуска будут выполняться только верхние и нижние строки.

Самый простой способ настройки (который сэкономит время в долгосрочной перспективе) — добавить псевдоним для команды в последней строке, которая фактически настраивает и запускает файл сервера. Это можно сделать с помощью:

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и удалив единственную строку, которая ее содержит.

Связанный контент