2

I installed a modded FTB server to my Ubuntu Server, created a user and group called "ftb", and gave it its own directory /opt/ftb/ that contains a folder with the server files. In the server folder, there is a start.sh file to start the server. How do I make a system service file so I can use commands such as systemctl status ftbacademy.service, systemctl start ftbacademy.service, and systemctl stop ftbacademy.service. Upon stopping the server I wish for it to save and then close the server. What would the .service file look like? I know it has to be placed in /etc/systemd/system/, but I don't know how to write the file that would make the ftb user open it's own virtual terminal or whatever to be able to save the world and then stop the server.

Ubuntu Server Version 20.04.3

FTB Academy 1.16 Server Files Download Site Used: https://feed-the-beast.com/modpacks/88/server/2077 I selected the Linux download option then ran the install file to automatically download the server files.

I am also using a different version of JDK to run the server file so I changed the start.sh file to this:

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

2 Answers2

2

I created a file called ftb@.service at the location /etc/systemd/system/. The file contains the following:

[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

Then I used systemctl enable ftb@academy and systemctl start ftb@academy to enable and start the server. I also realized that when I initially created the ftb user and gave it ownership of the folder that I didn't give it permission of the subfolders, so it was denied permission to start the server.

0

Take notice of the url for the EULA in the script. All it does is ask you have read, and if you accept, its terms, but only if you have not already been asked and answered yes.

So after the first time it is run, It will only ever execute the top and bottom lines.

The easiest way to set it up (which will save time in the long run) is to add an alias for the command on last line, which actually configures and starts the server file. This can be done with:

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

Running the command I added above is just a slight convenience, so you don't need to worry about adding the script to PATH or else having to either calculate the relative path or type the full path every time you want to start your server.

If you ever decide to delete the server, you can remove the "command" by editing ~/.bash_aliases and removing the single line that contains it.

Nate T
  • 1,590