![¿Cómo creo un servicio de inicio para un servidor de Minecraft que tiene un archivo start.sh?](https://rvso.com/image/1071725/%C2%BFC%C3%B3mo%20creo%20un%20servicio%20de%20inicio%20para%20un%20servidor%20de%20Minecraft%20que%20tiene%20un%20archivo%20start.sh%3F.png)
Instalé un servidor FTB modificado en mi servidor Ubuntu, creé un usuario y un grupo llamado "ftb" y le di su propio directorio /opt/ftb/
que contiene una carpeta con los archivos del servidor. En la carpeta del servidor, hay un archivo start.sh para iniciar el servidor. ¿Cómo creo un archivo de servicio del sistema para poder usar comandos como systemctl status ftbacademy.service
, systemctl start ftbacademy.service
y systemctl stop ftbacademy.service
. Al detener el servidor, deseo que se guarde y luego cierre el servidor. ¿Cómo sería el archivo .service? Sé que debe colocarse en /etc/systemd/system/
, pero no sé cómo escribir el archivo que haría que el usuario de ftb abra su propia terminal virtual o lo que sea para poder salvar el mundo y luego detener el servidor.
Versión del servidor Ubuntu 20.04.3
Sitio de descarga de archivos del servidor FTB Academy 1.16 utilizado:https://feed-the-beast.com/modpacks/88/server/2077Seleccioné la opción de descarga de Linux y luego ejecuté el archivo de instalación para descargar automáticamente los archivos del servidor.
También estoy usando una versión diferente de JDK para ejecutar el archivo del servidor, así que cambié el archivo start.sh a esto:
#!/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
Respuesta1
Creé un archivo llamado [email protected]
en la ubicación /etc/systemd/system/
. El archivo contiene lo siguiente:
[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
Luego usé systemctl enable ftb@academy
y systemctl start ftb@academy
para habilitar e iniciar el servidor. También me di cuenta de que cuando creé inicialmente el usuario ftb y le di la propiedad de la carpeta, no le di permiso para las subcarpetas, por lo que se le negó el permiso para iniciar el servidor.
Respuesta2
Tome nota de la URL del CLUF en el script. Lo único que hace es pedirle que haya leído y, si acepta, sus términos, pero sólo si aún no se le ha preguntado y ha respondido que sí.
Entonces, después de la primera vez que se ejecuta, solo ejecutará las líneas superior e inferior.
La forma más sencilla de configurarlo (lo que ahorrará tiempo a largo plazo) es agregar un alias para el comando en la última línea, que realmente configura e inicia el archivo del servidor. Esto se puede hacer con:
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
Ejecutar el comando que agregué arriba es solo una ligera conveniencia, por lo que no necesita preocuparse por agregar el script o PATH
tener que calcular la ruta relativa o escribir la ruta completa cada vez que desee iniciar su servidor.
Si alguna vez decide eliminar el servidor, puede eliminar el "comando" editando ~/.bash_aliases
y eliminando la única línea que lo contiene.