Skip to content

Instantly share code, notes, and snippets.

@keyz182
Last active August 29, 2015 14:04
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save keyz182/cafad1f6d293f52eca44 to your computer and use it in GitHub Desktop.
Save keyz182/cafad1f6d293f52eca44 to your computer and use it in GitHub Desktop.
Minecraft init script
#!/bin/bash
### 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: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Minecraft init script
# Description: This is a start up script for minecraft_server.jar server.
### END INIT INFO
### LSBise: http://wiki.debian.org/LSBInitScripts
### ADD ERROR HANDLING ###
### USE /lib/lsb/init-functions TO DISPLAY "Starting Minecraft server... [fail]" MESSAGE WHEN start_minecraft() FAILS (e.g., minecraft is already running, thus logically the start_minecraft() should fail)
### MAKE SURE TO REDIRECT ERRORS TO STDERR
### CREATE A COLORIZE FUNCTION WITH THE FOLLOWING USAGE: colorize_heredoc_text("string of $TEXT") --color red
PATH=/sbin:/bin:/usr/bin/:/usr/local/bin
# Please set the following variables and test this script before you install it.
MINECRAFT_USER=minecraft
MINE_PATH=/home/minecraft/DbyZ
MINE_BACKUP_PATH=/home/minecraft/DbyZ-Incremental
. /lib/lsb/init-functions
ME=`whoami`
TERM_MULTIPLEXER=tmux
if [ "$ME" != "$MINECRAFT_USER" ]
then
SESSION_INFO_CMD=`sudo -u $MINECRAFT_USER tmux list-sessions 2>&1`
else
SESSION_INFO_CMD=`tmux list-sessions 2>&1`
fi
GET_SESSION="tmux list-sessions"
CONNECT_CMD="tmux a -t ${SESSION_INFO_CMD::1}"
START_SESSION_CMD="tmux new -d -s minecraft"
#START_MINECRAFT_CMD="java -server -XX:+UseConcMarkSweepGC -Xms4096m -Xmx8192m -Xmn768m -jar forge-1.6.4-965.jar nogui"
START_MINECRAFT_CMD="java -server -XX:+UseLargePages -XX:+UseConcMarkSweepGC -Xms4096m -Xmx7002m -Xmn768m -jar forge-1.6.4-965.jar nogui"
SENDKEYS_CMD="tmux send-keys -t minecraft `printf 'stop\r'`"
SEND_CMD="tmux send-keys -t minecraft"
SENDKEYS_CMD_SAVE_OFF="tmux send-keys -t minecraft `printf 'save-off\r'`"
SENDKEYS_CMD_SAVE_ALL="tmux send-keys -t minecraft `printf 'save-all\r'`"
SENDKEYS_CMD_SAVE_ON="tmux send-keys -t minecraft `printf 'save-on\r'`"
DETACH_KEYS="Ctrl-b d"
start_minecraft()
{
if [ "$ME" != "$MINECRAFT_USER" ]
then
cd $MINE_PATH && sudo -u $MINECRAFT_USER $START_SESSION_CMD "$START_MINECRAFT_CMD"
else
cd $MINE_PATH && $START_SESSION_CMD "$START_MINECRAFT_CMD"
fi
}
stop_minecraft()
{
if [ "$ME" != "$MINECRAFT_USER" ]
then
sudo -u $MINECRAFT_USER $SENDKEYS_CMD
else
$SENDKEYS_CMD
fi
}
status_minecraft()
{
###############
ps auxww | grep -iEq "tmux.*[m]inecraft"
EXITVAL=$?
if [ "$ME" != "$MINECRAFT_USER" ]
then
SESSION_INFO=`sudo -u $MINECRAFT_USER $GET_SESSION 2>&1`
else
SESSION_INFO=`$GET_SESSION 2>&1`
fi
return $EXITVAL
}
save_off()
{
if [ "$ME" != "$MINECRAFT_USER" ]
then
sudo -u $MINECRAFT_USER $SEND_CMD 'say Starting Backup - World going Read-Only!' C-m
sudo -u $MINECRAFT_USER $SENDKEYS_CMD_SAVE_OFF
sudo -u $MINECRAFT_USER $SENDKEYS_CMD_SAVE_ALL
else
$SEND_CMD 'say Starting Backup - World going Read-Only!' C-m
$SENDKEYS_CMD_SAVE_OFF
$SENDKEYS_CMD_SAVE_ALL
fi
}
save_on()
{
if [ "$ME" != "$MINECRAFT_USER" ]
then
sudo -u $MINECRAFT_USER $SENDKEYS_CMD_SAVE_ON
sudo -u $MINECRAFT_USER $SEND_CMD 'say Backup Complete!' C-m
else
$SENDKEYS_CMD_SAVE_ON
$SEND_CMD 'say Backup Complete!' C-m
fi
}
full_backup(){
save_off
if [ "$ME" != "$MINECRAFT_USER" ]
then
sudo -u $MINECRAFT_USER tar czf $MINE_BACKUP_PATH/fullbackup.tar.gz $MINE_PATH > /dev/null 2>&1
else
tar czf $MINE_BACKUP_PATH/fullbackup.tar.gz $MINE_PATH > /dev/null 2>&1
fi
save_off
}
rdiff_backup(){
DATE=$(date +%Y-%m-%d-%H)
if [ "$ME" != "$MINECRAFT_USER" ]
then
sudo -u $MINECRAFT_USER cp $MINE_PATH/server.log $MINE_PATH/logs/server-$DATE.log
sleep 1
cat /dev/null | sudo -u $MINECRAFT_USER tee $MINE_PATH/server.log
save_off
sudo -u $MINECRAFT_USER nice -n 10 rdiff-backup --print-statistics $MINE_PATH $MINE_BACKUP_PATH/backups > $MINE_BACKUP_PATH/logs/$DATE-$server-backup.log
sudo -u $MINECRAFT_USER rdiff-backup --force --remove-older-than 48B $MINE_BACKUP_PATH/backups
save_on
else
cp $MINE_PATH/server.log $MINE_PATH/logs/server-$DATE.log
sleep 1
cat /dev/null > $MINE_PATH/server.log
save_off
nice -n 10 rdiff-backup --print-statistics $MINE_PATH $MINE_BACKUP_PATH/backups > $MINE_BACKUP_PATH/logs/$DATE-$server-backup.log
rdiff-backup --force --remove-older-than 48B $MINE_BACKUP_PATH/backups
save_on
fi
}
backup_list(){
if [ "$ME" != "$MINECRAFT_USER" ]
then
sudo -u $MINECRAFT_USER rdiff-backup -l $MINE_BACKUP_PATH/backups
sudo -u $MINECRAFT_USER rdiff-backup --list-increment-sizes $MINE_BACKUP_PATH/backups
else
rdiff-backup -l $MINE_BACKUP_PATH/backups
rdiff-backup --list-increment-sizes $MINE_BACKUP_PATH/backups
fi
}
case "$1" in
start)
log_begin_msg "Starting Minecraft server..."
status_minecraft && echo -n "ERROR: Minecraft already appears to be running." || start_minecraft
log_end_msg 0
;;
stop)
log_begin_msg "Stopping Minecraft server..."
stop_minecraft
log_end_msg 0
;;
status)
status_minecraft
if [ -e $MINE_PATH/ForgeModLoader-server-0.log.lck ] && [ "$EXITVAL" -eq "0" ]; then
if [ "$ME" != "$MINECRAFT_USER" ]
then
cat <<- -EOF-
Minecraft appears to be running...
`echo -e "\033[22;32m"`*`tput sgr0`$TERM_MULTIPLEXER session info: `echo -e "\033[22;32m"`$SESSION_INFO`tput sgr0`
`echo -e "\033[22;32m"`*`tput sgr0`To connect to the $TERM_MULTIPLEXER(1) session and administrate the minecraft server, do the following: `echo -e "\033[22;33m"`sudo -u $MINECRAFT_USER $CONNECT_CMD`tput sgr0`
`echo -e "\033[22;32m"`*`tput sgr0`When finished, detach from the session with the following keystrokes: `echo -e "\033[22;34m"`$DETACH_KEYS`tput sgr0`.
-EOF-
exit 0
else
cat <<- -EOF-
Minecraft appears to be running...
`echo -e "\033[22;32m"`*`tput sgr0`$TERM_MULTIPLEXER session info: `echo -e "\033[22;32m"`$SESSION_INFO`tput sgr0`
`echo -e "\033[22;32m"`*`tput sgr0`To connect to the $TERM_MULTIPLEXER(1) session and administrate the minecraft server, do the following: `echo -e "\033[22;33m"`$CONNECT_CMD`tput sgr0`
`echo -e "\033[22;32m"`*`tput sgr0`When finished, detach from the session with the following keystrokes: `echo -e "\033[22;34m"`$DETACH_KEYS`tput sgr0`.
-EOF-
exit 0
fi
else
cat <<- -EOF-
Minecraft does not appear to be running...
`echo -e "\033[22;31m"`*`tput sgr0`$TERM_MULTIPLEXER session information: `echo -e "\033[22;31m"`$SESSION_INFO`tput sgr0`
-EOF-
exit 1
fi
;;
restart)
log_begin_msg "Restarting Minecraft server..."
stop_minecraft
sleep 2
start_minecraft
log_end_msg 0
;;
timed-restart)
sudo -u $MINECRAFT_USER $SEND_CMD 'say Restarting Minecraft server in 5 minutes' C-m
sleep 1m
sudo -u $MINECRAFT_USER $SEND_CMD 'say Restarting Minecraft server in 4 minutes' C-m
sleep 1m
sudo -u $MINECRAFT_USER $SEND_CMD 'say Restarting Minecraft server in 3 minutes' C-m
sleep 1m
sudo -u $MINECRAFT_USER $SEND_CMD 'say Restarting Minecraft server in 2 minutes' C-m
sleep 1m
sudo -u $MINECRAFT_USER $SEND_CMD 'say Restarting Minecraft server in 1 minutes' C-m
sleep 30s
sudo -u $MINECRAFT_USER $SEND_CMD 'say Restarting Minecraft server in 30 seconds' C-m
sleep 20s
sudo -u $MINECRAFT_USER $SEND_CMD 'say Restarting Minecraft server in 10 seconds' C-m
sleep 1s
sudo -u $MINECRAFT_USER $SEND_CMD 'say Restarting Minecraft server in 9 seconds' C-m
sleep 1s
sudo -u $MINECRAFT_USER $SEND_CMD 'say Restarting Minecraft server in 8 seconds' C-m
sleep 1s
sudo -u $MINECRAFT_USER $SEND_CMD 'say Restarting Minecraft server in 7 seconds' C-m
sleep 1s
sudo -u $MINECRAFT_USER $SEND_CMD 'say Restarting Minecraft server in 6 seconds' C-m
sleep 1s
sudo -u $MINECRAFT_USER $SEND_CMD 'say Restarting Minecraft server in 5 seconds' C-m
sleep 1s
sudo -u $MINECRAFT_USER $SEND_CMD 'say Restarting Minecraft server in 4 seconds' C-m
sleep 1s
sudo -u $MINECRAFT_USER $SEND_CMD 'say Restarting Minecraft server in 3 seconds' C-m
sleep 1s
sudo -u $MINECRAFT_USER $SEND_CMD 'say Restarting Minecraft server in 2 seconds' C-m
sleep 1s
sudo -u $MINECRAFT_USER $SEND_CMD 'say Restarting Minecraft server in 1 seconds' C-m
sleep 1s
sudo -u $MINECRAFT_USER $SEND_CMD 'say Restarting Minecraft server...' C-m
stop_minecraft
sleep 10s
start_minecraft
log_end_msg 0
;;
save-off)
log_begin_msg "Disabling save on MC Server..."
save_off
log_end_msg 0
;;
save-on)
log_begin_msg "Enabling save on MC Server..."
save_on
log_end_msg 0
;;
backup)
log_begin_msg "Backing up..."
rdiff_backup
log_end_msg 0
;;
full-backup)
log_begin_msg "Backing up..."
full_backup
log_end_msg 0
;;
list-backup)
log_begin_msg "Listing Backups..."
backup_list "${2}"
log_end_msg 0
;;
*)
echo "Usage: $0 start|stop|status|restart|timed-restart|save-off|save-on|backup|list-backup|full-backup" >&2
exit 3
;;
esac
exit 0
@keyz182
Copy link
Author

keyz182 commented Jul 29, 2014

Note that this requires hugepages to be enabled on the server to work. Swap the two "START_MINECRAFT_CMD" if you hugepages isn't enabled.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment