Роль для настройки сервера майнкрафт под Alpine Linux
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

158 lines
4.4 KiB

#!/sbin/openrc-run
# /etc/init.d/minecraft
#
# Minecraft - OpenRC scripts
# Copyright (C) 2024 Santic Zombie [email@santic-zombie.ru]
#
#
extra_commands="reload backup listen"
INSTANCE=${RC_SVCNAME##*.}
PIDFILE="/var/run/${RC_SVCNAME}.pid"
BIN="$(ls ${BASE} -v 2>/dev/null | grep -i "craftbukkit.*jar\\|spigot.*jar\\|paper*.*jar\\|minecraft_server.*jar" | head -n 1)"
INVOCATION="/usr/bin/java -server -Xms${MINHEAP:-128M} -Xmx${MAXHEAP:-1024M} \
${CUSTOMARGS} -jar ${BIN} nogui"
depend() {
need net localmount
after bootmisc
use logger
}
ME=`whoami`
as_user() {
if [ "${ME}" = "${USER}" ] ; then
ash -c "$1"
else
su - "${USER}" -c "$1"
fi
}
start_pre () {
if [ -z "${BIN}" ]; then
eerror "${RC_SVCNAME} cannot find a proper server jar."
eerror "Check your game installation at ${BASE}."
return 1
fi
[ -f "${PIDFILE}" ] && rm ${PIDFILE}
return 0
}
start () {
ebegin "Starting Minecraft server daemon"
if pgrep -u "${USER}" -f "${BIN}" > /dev/null ; then
einfo "Minecraft server is already running!"
else
ebegin "Starting in progress"
cd "${BASE}"
as_user "cd ${BASE} && screen -dmS ${SCREENNAME} ${INVOCATION}"
sleep 10
pgrep -f "${BIN}" | tail -1 > "${PIDFILE}"
if pgrep -u "${USER}" -f "${BIN}" | tail -1 > /dev/null ; then
einfo "${INSTANCE} is now running."
else
eerror "Error! Could not start ${INSTANCE}! :("
return 2
fi
fi
}
stop() {
ebegin "Stopping Minecraft server daemon"
if pgrep -u "${USER}" -f "${BIN}" > /dev/null ; then
ebegin "Stopping in progress"
as_user "screen -p 0 -S ${SCREENNAME} -X eval 'stuff \"say SERVER SHUTTING DOWN IN 30 SECONDS. Saving map...\"\015'"
as_user "screen -p 0 -S ${SCREENNAME} -X eval 'stuff \"save-all\"\015'"
sleep 10
as_user "screen -p 0 -S ${SCREENNAME} -X eval 'stuff \"stop\"\015'"
sleep 10
else
einfo "${INSTANCE} was not running."
fi
if pgrep -u "${USER}" -f "${BIN}" > /dev/null ; then
eerror "Error! ${INSTANCE} could not be stopped."
else
einfo "${INSTANCE} is stopped."
fi
# Hard stop the server
start-stop-daemon --stop --chdir ${BASE} --pidfile ${PIDFILE} --user ${USER} --group ${GROUP} --retry 5 2>/dev/null
eend 0
}
restart() {
ebegin "Reload Minecraft server daemon"
stop
start
eend $?
}
reload() {
ebegin "Reload Minecraft server"
if pgrep -u "${USER}" -f "${BIN}" > /dev/null ; then
ebegin "Reloading in progress"
as_user "screen -p 0 -S ${SCREENNAME} -X eval 'stuff \"say SERVER RELOADING IN 40 SECONDS. Saving map...\"\015'"
as_user "screen -p 0 -S ${SCREENNAME} -X eval 'stuff \"save-all\"\015'"
sleep 10
as_user "screen -p 0 -S ${SCREENNAME} -X eval 'stuff \"reload\"\015'"
as_user "screen -p 0 -S ${SCREENNAME} -X eval 'stuff \"reload confirm\"\015'"
sleep 10
else
einfo "${INSTANCE} was not running."
fi
if pgrep -u "${USER}" -f "${BIN}" > /dev/null ; then
einfo "Server reloaded."
as_user "screen -p 0 -S ${SCREENNAME} -X eval 'stuff \"say SERVER SUCCESSFULLY RELOADED!\"\015'"
else
eerror "Error! ${INSTANCE} could not reloaded! :("
fi
}
saveoff() {
if pgrep -u "${USER}" -f "${BIN}" > /dev/null ; then
einfo "Server is running... suspending saves"
as_user "screen -p 0 -S ${SCREENNAME} -X eval 'stuff \"say SERVER BACKUP STARTING. Server going readonly...\"\015'"
as_user "screen -p 0 -S ${SCREENNAME} -X eval 'stuff \"save-off\"\015'"
as_user "screen -p 0 -S ${SCREENNAME} -X eval 'stuff \"save-all\"\015'"
sync
sleep 10
else
einfo "${INSTANCE} is not running."
fi
}
saveon() {
if pgrep -u "${USER}" -f "${BIN}" > /dev/null ; then
einfo "Server is running... re-enabling saves"
as_user "screen -p 0 -S ${SCREENNAME} -X eval 'stuff \"save-on\"\015'"
as_user "screen -p 0 -S ${SCREENNAME} -X eval 'stuff \"say SERVER BACKUP ENDED. Server going read-write...\"\015'"
else
echo "${INSTANCE} is not running. Not resuming saves."
fi
}
backup() {
saveoff
NOW=`date "+%Y-%m-%d_%Hh%M"`
BACKUP_FILE="${BACKUP_BASE}/backup_${NOW}.tar"
einfo "Backing up minecraft server..."
as_user "tar -C \"${BASE}\" -cf \"$BACKUP_FILE\" ."
saveon
einfo "Compressing backup..."
as_user "gzip -f \"$BACKUP_FILE\""
einfo "Done."
}
listen() {
if pgrep -u "${USER}" -f "${BIN}" > /dev/null ; then
as_user "tail -f ${BASE}/logs/latest.log"
else
echo "${INSTANCE} is not running. Cannot listen to server."
fi
}