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
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
|
|
}
|
|
|