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