blob: 3f4125467d128e701ec98865dcc441d4fdec69a9 [file] [log] [blame] [raw]
#!/bin/sh
### BEGIN INIT INFO
# Provides: minecraft
# Required-Start: $local_fs $remote_fs
# Required-Stop: $local_fs $remote_fs
# Should-Start: $network
# Should-Stop: $network
# Default-Start: 3 5
# Default-Stop: 0 1 6
# Short-Description: Minecraft server
# Description: Init script for minecraft server
### END INIT INFO
# Copyright 2015-2018 Rivoreo
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE
# FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
[ -f /etc/default/minecraft ] && . /etc/default/minecraft
set -e
[ -z "$MINECRAFT_USER_NAME" ] && MINECRAFT_USER_NAME=minecraft
[ -z "$MINECRAFT_HOME" ] && MINECRAFT_HOME="`getent passwd $MINECRAFT_USER_NAME | cut -d : -f 6`"
[ -z "$MINECRAFT_START_COMMAND" ] && MINECRAFT_START_COMMAND="exec sh start.sh"
if [ -z "$MINECRAFT_SERVERS" ]; then
echo "No server defined, exiting" 1>&2
exit 255
fi
[ `id -u` = 0 ] && exec sudo -u "$MINECRAFT_USER_NAME" "$0" "$@"
case "$MINECRAFT_USE_TMUX" in
[Oo][Nn]|[Yy][Ee][Ss]|Y|[Tt][Rr][Uu][Ee]|1)
MINECRAFT_USE_TMUX=1
[ -z "$MINECRAFT_SESSION_NAME" ] && MINECRAFT_SESSION_NAME=minecraft
;;
[Oo][Ff][Ff]|[Nn][Oo]|N|[Ff][Aa][Ll][Ss][Ee]|0|"")
MINECRAFT_USE_TMUX=0
[ -z "$MINECRAFT_ALTERNATIVE_LOG_FILE" ] && MINECRAFT_ALTERNATIVE_LOG_FILE=/dev/null
;;
*)
echo "Unrecognized value of MINECRAFT_USE_TMUX" 1>&2
exit 1
esac
check_user() {
[ "`whoami`" = "$MINECRAFT_USER_NAME" ] && return 0
echo "Permission denied" 1>&2
exit 1
}
PID=
is_running() {
if [ $# != 1 ]; then
printf "Internal error: is_running: # (%s) != 1\\n" $# 1>&2
exit 2
fi
pid_file="$MINECRAFT_HOME/$1/server.pid"
#[ -f "$pid_file" ] && PID="`cat \"$pid_file\"`" && [ -n "$PID" ] && [ "$PID" != 0 ] && [ "`ps -o comm= -p $PID`" = java ]
[ -f "$pid_file" ] && PID="`cat \"$pid_file\"`" && [ -n "$PID" ] && [ "$PID" != 0 ] && ps -o comm= -p $PID | grep -Fq java && return 0
rm -f "$pid_file"
return 1
}
minecraft_start() {
check_user
r=0
for i in $MINECRAFT_SERVERS; do
if is_running "$i"; then
printf "Server %s is already running\\n" "$i"
continue
fi
#echo Starting Minecraft server...
cd "$MINECRAFT_HOME/$i" || continue
if [ "$MINECRAFT_USE_TMUX" = 1 ]; then
tmux -L "$MINECRAFT_SESSION_NAME-$i" new-session -d "$MINECRAFT_START_COMMAND"
else
sh -c "$MINECRAFT_START_COMMAND" < /dev/null >> "$MINECRAFT_ALTERNATIVE_LOG_FILE" 2>&1 & sh_pid=$!
fi
sleep 1
if is_running "$i"; then
if [ "$MINECRAFT_USE_TMUX" = 1 ] || [ $PID = $sh_pid ]; then
printf "Minecraft server %s started\\n" "$i"
else
printf "Minecraft server %s appeared to be started, but PID mismatch (%s!=%s)\\n" "$i" $PID $sh_pid
fi
else
printf "Failed to start Minecraft server %s\\n" "$i"
r=$((r+1))
fi
done
return $r
}
minecraft_stop() {
check_user
for i in $MINECRAFT_SERVERS; do
if ! is_running "$i"; then
printf "Server %s is not running\\n" "$i" 1>&2
continue
fi
if [ "$MINECRAFT_USE_TMUX" = 1 ]; then
tmux -L "$MINECRAFT_SESSION_NAME-$i" send-keys -t 0 C-u stop ENTER
#sleep 4
j=8
while [ $j -gt 0 ]; do
j=$((j-1))
sleep 0.5
printf .
if ! is_running "$i"; then
printf " %s stopped\\n" "$i" 1>&2
continue 2
fi
done
echo
fi
echo "Sending SIGINT..." 1>&2
kill -s INT "$PID"
#sleep 2
j=4
if while [ $j -gt 0 ]; do
j=$((j-1))
sleep 0.5
if ! is_running "$i"; then
j=0
false
fi
done; then
echo "Sending SIGTERM..." 1>&2
kill "$PID"
j=8
if while [ $j -gt 0 ]; do
j=$((j-1))
sleep 0.5
if ! is_running "$i"; then
j=0
false
fi
done; then
echo "Sending SIGKILL..." 1>&2
kill -s KILL $PID
fi
fi
printf "%s stopped\\n" "$i" 1>&2
done
}
case "$1" in
start)
minecraft_start
;;
stop)
minecraft_stop
;;
restart)
minecraft_stop
sleep 0.5
minecraft_start
;;
status)
r=0
for i in $MINECRAFT_SERVERS; do
if is_running "$i"; then
printf "%s is running (pid %s)\\n" "$i" "$PID"
else
printf "%s is not running\\n" "$i"
r=$((r+1))
fi
done
exit $r
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
exit 255
;;
esac