Como faço um serviço de inicialização para um servidor Minecraft que possui um arquivo start.sh?

Como faço um serviço de inicialização para um servidor Minecraft que possui um arquivo start.sh?

Instalei um servidor FTB modificado em meu servidor Ubuntu, criei um usuário e um grupo chamado "ftb" e dei a ele seu próprio diretório /opt/ftb/que contém uma pasta com os arquivos do servidor. Na pasta do servidor, existe um arquivo start.sh para iniciar o servidor. Como faço um arquivo de serviço do sistema para poder usar comandos como systemctl status ftbacademy.service, systemctl start ftbacademy.servicee systemctl stop ftbacademy.service. Ao parar o servidor, desejo que ele salve e feche o servidor. Qual seria a aparência do arquivo .service? Eu sei que tem que ser colocado /etc/systemd/system/, mas não sei como escrever o arquivo que faria o usuário ftb abrir seu próprio terminal virtual ou qualquer outra coisa para poder salvar o mundo e então parar o servidor.

Servidor Ubuntu versão 20.04.3

Site de download de arquivos do servidor FTB Academy 1.16 usado:https://feed-the-beast.com/modpacks/88/server/2077Selecionei a opção de download do Linux e executei o arquivo de instalação para baixar automaticamente os arquivos do servidor.

Também estou usando uma versão diferente do JDK para executar o arquivo do servidor, então alterei o arquivo start.sh para este:

#!/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

Responder1

Criei um arquivo chamado [email protected]no local /etc/systemd/system/. O arquivo contém o seguinte:

[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

Então usei systemctl enable ftb@academye systemctl start ftb@academypara habilitar e iniciar o servidor. Também percebi que quando criei inicialmente o usuário ftb e dei a ele a propriedade da pasta, não dei permissão para as subpastas, então foi negada permissão para iniciar o servidor.

Responder2

Observe o URL do EULA no script. Tudo o que ele faz é perguntar se você leu e, se aceitar, seus termos, mas somente se ainda não tiver sido questionado e respondido sim.

Portanto, após a primeira execução, ele executará apenas as linhas superior e inferior.

A maneira mais fácil de configurá-lo (o que economizará tempo no longo prazo) é adicionar um alias para o comando na última linha, que realmente configura e inicia o arquivo do servidor. Isso pode ser feito com:

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

Executar o comando que adicionei acima é apenas uma pequena conveniência, então você não precisa se preocupar em adicionar o script ou PATHter que calcular o caminho relativo ou digitar o caminho completo toda vez que quiser iniciar o servidor.

Se você decidir excluir o servidor, poderá remover o “comando” editando ~/.bash_aliasese removendo a única linha que o contém.

informação relacionada