Skip to content

Instantly share code, notes, and snippets.

@ariela
Created August 2, 2011 04:28
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ariela/1119604 to your computer and use it in GitHub Desktop.
Save ariela/1119604 to your computer and use it in GitHub Desktop.
minecraftのサーバ起動スクリプト(centosでのみテスト)
#!/bin/sh
#
# minecraft Startup script for the minecraft Server
#
# chkconfig: - 90 25
# description: Minecraft is Sandbox game server.
# processname: minecraft
# パス設定 =========================================================================================
MC_PATH_HOME="/opt/minecraft" # minecraftサーバの基本位置
MC_PATH_SERVER="${MC_PATH_HOME}/server" # サーバプログラム位置
MC_PATH_SERVER_BACKUP="${MC_PATH_SERVER}/backup" # サーバプログラムバックアップ位置
MC_PATH_DATA="${MC_PATH_HOME}/data" # サーバデータ位置
MC_PATH_DATA_BACKUP="${MC_PATH_DATA}/backup" # サーバデータバックアップ位置
MC_PATH_PLUGIN="${MC_PATH_DATA}/plugins" # プラグイン位置
MC_PATH_TMP="${MC_PATH_HOME}/tmp" # テンポラリ位置
MC_PATH_TMP_UPDATE="${MC_PATH_TMP}/update" # 更新用テンポラリ位置
MC_PATH_TMP_PATCH="${MC_PATH_TMP}/patch" # パッチ用テンポラリ位置
# マシン設定 =======================================================================================
MC_USE_CPU=2 # GCに使用するCPU数
MC_USE_MEM_MIN="2048M" # 割り当てるメモリ容量(初期)
MC_USE_MEM_MAX="2048M" # 割り当てるメモリ容量(最大)
# サーバ設定 =======================================================================================
MC_USER="minecraft" # サーバプログラムの実行ユーザ
MC_SERVICE="minecraft_server.jar" # サーバプログラム名
MC_SERVICE_NAME="Ariela Server" # サーバの識別用名
MC_OPTION="nogui" # サーバプログラムオプション
MC_STOP_INTERVAL=60 # サーバ停止時の待ち時間
MC_SCREENNAME="minecraft-server" # screenの名称
# minecraftを実行するコマンド ======================================================================
MC_INVOCATION="java -Xms${MC_USE_MEM_MIN} -Xmx${MC_USE_MEM_MAX} -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalPacing -XX:ParallelGCThreads=${MC_USE_CPU} -XX:+AggressiveOpts -jar ${MC_PATH_SERVER}/${MC_SERVICE} ${MC_OPTION}"
# バックアップ設定 =================================================================================
MC_BACKUP_FILE=`date '+%Y%m%d-%H'`
MC_BACKUP_PREF_WORLD="world-"
MC_BACKUP_PREF_NETHER="nether-"
MC_BACKUP_PREF_SERVER="server-"
MC_BACKUP_NAME_WORLD="world"
MC_BACKUP_NAME_NETHER="world_nether"
# 更新設定 =========================================================================================
MC_DOWNLOAD_JP_FILE="jp.zip"
#CraftBukkitの場合
MC_DOWNLOAD_FILE="craftbukkit-0.0.1-SNAPSHOT.jar"
MC_DOWNLOAD_URI="http://ci.bukkit.org/job/dev-CraftBukkit/lastSuccessfulBuild/artifact/target/craftbukkit-0.0.1-SNAPSHOT.jar"
MC_DOWNLOAD_JP_URI="http://zeeksphere.sakura.ne.jp/minecraft/LangXForBukkit104.zip"
#公式サーバの場合
#MC_DOWNLOAD_FILE="minecraft_server.jar"
#MC_DOWNLOAD_URI=http://www.minecraft.net/download/minecraft_server.jar?v=`date | sed "s/[^a-zA-Z0-9]/_/g"`
#MC_DOWNLOAD_JP_URI="http://zeeksphere.sakura.ne.jp/minecraft/JaModForOfficialServer.zip"
# プラグイン更新 ===================================================================================
MC_PLUG_TRANSPORTER_URL="http://bukkit-transporter.googlecode.com/files/Transporter-v7.2.jar"
# コマンド送信 =====================================================================================
MC_SEND="screen -p 0 -S ${MC_SCREENNAME} -X eval"
# 表示設定 =========================================================================================
RESET=$'\e[0m'
BOLD=$'\e[1m'
RED=$'\e[1;31m'
GREEN=$'\e[1;32m'
# ユーザ別実行 #####################################################################################
ME=`whoami`
as_user() {
if [ ${ME} == ${MC_USER} ] ; then
bash -c "$1"
else
su - ${MC_USER} -c "$1"
fi
}
# メッセージ出力 ###################################################################################
as_message() {
echo "minecraft: ${MC_SERVICE_NAME}: [${2}${1}${RESET}]"
}
# ファイルダウンロード #############################################################################
download() {
as_message "${2}をダウンロードしています..." "${BOLD}"
as_user "wget -q -O ${MC_PATH_TMP}/${2} ${1}"
if [ -f ${MC_PATH_TMP}/${2} ]; then
as_message "${2}のダウンロードを完了しました" "${GREEN}"
if [ $# -eq 3 ]; then
# 第3引数が指定されている場合は更新チェック
if [ -f ${3} ]; then
if `diff ${MC_PATH_TMP}/${2} ${3} >/dev/null`; then
as_message "${2}は最新版です" "${GREEN}"
return 0
else
as_message "${2}は更新されています" "${RED}"
return 1
fi
else
as_message "${2}は更新されています" "${RED}"
return 1
fi
fi
return 1
else
as_message "${2}のダウンロードに失敗しました" "${RED}"
return 0
fi
}
# 起動処理 #########################################################################################
mc_start() {
if ps ax | grep -v grep | grep -v -i SCREEN | grep ${MC_SERVICE} > /dev/null
then
as_message "既に起動しています" "${GREEN}"
else
as_message "起動処理中です" "${BOLD}"
cd ${MC_PATH_DATA}
as_user "cd ${MC_PATH_DATA} && screen -AmdS ${MC_SCREENNAME} ${MC_INVOCATION}"
sleep 7
if ps ax | grep -v grep | grep -v -i SCREEN | grep ${MC_SERVICE} > /dev/null
then
as_message "起動に成功しました" "${GREEN}"
else
as_message "起動に失敗しました" "${RED}"
fi
fi
}
# 停止処理 #########################################################################################
mc_stop() {
if ps ax | grep -v grep | grep -v -i SCREEN | grep ${MC_SERVICE} > /dev/null
then
as_message "停止処理中です" "${BOLD}"
as_user "${MC_SEND} 'stuff \"say SERVER SHUTTING DOWN IN ${MC_STOP_INTERVAL} SECONDS.\"\015'"
i=${MC_STOP_INTERVAL}
while [ ${i} -ne 0 ]
do
if test `expr ${i} % 30` -eq 0 -o ${i} -le 10
then
as_user "${MC_SEND} 'stuff \"say SERVER WILL STOP IN ${i} SECONDS.\"\015'"
fi
i=`expr ${i} - 1`
sleep 1
done
as_user "${MC_SEND} 'stuff \"say saving map...\"\015'"
as_user "${MC_SEND} 'stuff \"save-all\"\015'"
as_user "${MC_SEND} 'stuff \"stop\"\015'"
sleep 7
if ps ax | grep -v grep | grep -v -i SCREEN | grep ${MC_SERVICE} > /dev/null
then
as_message "停止に失敗しました" "${RED}"
else
as_message "停止に成功しました" "${GREEN}"
fi
else
as_message "既に停止しています" "${RED}"
fi
}
# 高速停止処理 #####################################################################################
mc_rapidstop() {
if ps ax | grep -v grep | grep -v -i SCREEN | grep ${MC_SERVICE} > /dev/null
then
as_message "停止処理中です" "${BOLD}"
as_user "${MC_SEND} 'stuff \"save-all\"\015'"
as_user "${MC_SEND} 'stuff \"stop\"\015'"
sleep 7
if ps ax | grep -v grep | grep -v -i SCREEN | grep ${MC_SERVICE} > /dev/null
then
as_message "停止に失敗しました" "${RED}"
else
as_message "停止に成功しました" "${GREEN}"
fi
else
echo "${MC_SERVICE_NAME}: [${RED}停止中${RESET}]"
fi
}
# リロード処理 #####################################################################################
mc_reload() {
if ps ax | grep -v grep | grep -v -i SCREEN | grep ${MC_SERVICE} > /dev/null
then
as_message "再読み込み処理中です" "${BOLD}"
as_user "${MC_SEND} 'stuff \"reload\"\015'"
sleep 7
as_message "再読み込みに成功しました" "${GREEN}"
else
as_message "再読み込みに失敗しました" "${RED}"
fi
}
# ステータスチェック処理 ###########################################################################
mc_status() {
if ps ax | grep -v grep | grep -v -i SCREEN | grep ${MC_SERVICE} > /dev/null
then
as_message "起動中です" "${GREEN}"
else
as_message "停止中です" "${RED}"
fi
}
# バックアップ処理 #################################################################################
mc_backup_world() {
ARCFILE=${MC_PATH_DATA_BACKUP}/${MC_BACKUP_PREF_WORLD}${MC_BACKUP_FILE}.tgz
TRGFILE=${MC_BACKUP_NAME_WORLD}
as_message "${MC_BACKUP_NAME_WORLD} バックアップ処理中です" "${BOLD}"
as_user "cd ${MC_PATH_DATA} && tar -czf ${ARCFILE} ${TRGFILE}"
ARCFILE=${MC_PATH_DATA_BACKUP}/${MC_BACKUP_PREF_NETHER}${MC_BACKUP_FILE}.tgz
TRGFILE=${MC_BACKUP_NAME_NETHER}
as_message "${MC_BACKUP_NAME_NETHER} バックアップ処理中です" "${BOLD}"
as_user "cd ${MC_PATH_DATA} && tar -czf ${ARCFILE} ${TRGFILE}"
as_message "バックアップが完了しました" "${GREEN}"
}
mc_backup_server() {
ARCFILE=${MC_PATH_SERVER_BACKUP}/${MC_BACKUP_PREF_SERVER}${MC_BACKUP_FILE}.tgz
TRGFILE=${MC_SERVICE}
as_message "${MC_SERVICE} バックアップ処理中です" "${BOLD}"
as_user "cd ${MC_PATH_SERVER} && tar -czf ${ARCFILE} ${TRGFILE}"
as_message "バックアップが完了しました" "${GREEN}"
}
# サーバプログラムアップデート #####################################################################
mc_update() {
if ps ax | grep -v grep | grep -v -i SCREEN | grep ${MC_SERVICE} > /dev/null; then
as_message "サーバが起動中なのでアップデートできません" "${RED}"
else
mc_backup_server
as_message "サーバアップデート処理中です" "${BOLD}"
download "${MC_DOWNLOAD_URI}" "${MC_DOWNLOAD_FILE}" "${MC_PATH_TMP_UPDATE}/${MC_DOWNLOAD_FILE}"
if [ $? -eq 1 ]; then
as_user "cp ${MC_PATH_TMP}/${MC_DOWNLOAD_FILE} ${MC_PATH_TMP_UPDATE}/${MC_DOWNLOAD_FILE}"
# 日本語mod patch
as_message "日本語mod導入処理中です" "${BOLD}"
download "${MC_DOWNLOAD_JP_URI}" "${MC_DOWNLOAD_JP_FILE}"
as_user "mkdir ${MC_PATH_TMP_PATCH}"
as_user "unzip -q -o -d ${MC_PATH_TMP_PATCH} ${MC_PATH_TMP}/${MC_DOWNLOAD_JP_FILE}"
as_user "rm -f ${MC_PATH_TMP}/${MC_DOWNLOAD_JP_FILE}"
as_user "jar cMf ${MC_PATH_TMP}/${MC_DOWNLOAD_FILE} ${MC_PATH_TMP_PATCH}/*"
as_user "rm -rf ${MC_PATH_TMP_PATCH}"
as_message "日本語mod導入を完了しました" "${GREEN}"
as_user "mv --force ${MC_PATH_TMP}/${MC_DOWNLOAD_FILE} ${MC_PATH_SERVER}/${MC_DOWNLOAD_FILE}"
as_user "ln -sf ${MC_PATH_SERVER}/${MC_DOWNLOAD_FILE} ${MC_PATH_SERVER}/${MC_SERVICE}"
as_message "${MC_SERVICE_NAME}のアップデートに成功しました" "${GREEN}"
fi
fi
}
# プラグインアップデート ###########################################################################
mc_plugin_update() {
# Permissions
MC_T_URL="http://www.theyeticave.net/downloads/permissions/latest/Permissions.jar"
MC_T_FIL="Permissions.jar"
download "${MC_T_URL}" "${MC_T_FIL}"
as_user "mv --force ${MC_PATH_TMP}/${MC_T_FIL} ${MC_PATH_PLUGIN}/${MC_T_FIL}"
# MyHome
MC_T_URL="http://www.playminecraft.net/MyHome/MyHome.jar"
MC_T_FIL="MyHome.jar"
download "${MC_T_URL}" "${MC_T_FIL}"
as_user "mv --force ${MC_PATH_TMP}/${MC_T_FIL} ${MC_PATH_PLUGIN}/${MC_T_FIL}"
# MyWarp
MC_T_URL="http://procrafter.de/downloads/MyWarp.jar"
MC_T_FIL="MyWarp.jar"
download "${MC_T_URL}" "${MC_T_FIL}"
as_user "mv --force ${MC_PATH_TMP}/${MC_T_FIL} ${MC_PATH_PLUGIN}/${MC_T_FIL}"
# LWC
MC_T_URL="http://griefcraft.com/bukkit/lwc/release/LWC.jar"
MC_T_FIL="LWC.jar"
download "${MC_T_URL}" "${MC_T_FIL}"
as_user "mv --force ${MC_PATH_TMP}/${MC_T_FIL} ${MC_PATH_PLUGIN}/${MC_T_FIL}"
# Transporter
MC_T_URL="${MC_PLUG_TRANSPORTER_URL}"
MC_T_FIL="Transporter.jar"
download "${MC_T_URL}" "${MC_T_FIL}"
as_user "mv --force ${MC_PATH_TMP}/${MC_T_FIL} ${MC_PATH_PLUGIN}/${MC_T_FIL}"
# dynmap
MC_T_URL="http://webbukkit.org/jenkins/public/dynmap/dynmap-recommended-bin.zip"
MC_T_FIL="dynmap-recommended-bin.zip"
download "${MC_T_URL}" "${MC_T_FIL}"
as_user "mkdir ${MC_PATH_TMP_PATCH}"
as_user "unzip -q -o -d ${MC_PATH_TMP_PATCH} ${MC_PATH_TMP}/${MC_T_FIL}"
as_user "cp -rf ${MC_PATH_TMP_PATCH}/* ${MC_PATH_PLUGIN}/"
as_user "rm -rf ${MC_PATH_TMP_PATCH}"
}
# 処理分岐 #########################################################################################
case "$1" in
start)
mc_start
;;
stop)
mc_stop
;;
reload)
mc_reload
;;
rapidstop)
mc_rapidstop
;;
restart)
as_user "${MC_SEND} 'stuff \"say SERVER WILL RESTART! PLEASE LOGOUT!\"\015'"
mc_stop
mc_start
;;
rapidrestart)
mc_rapidstop
mc_start
;;
backup)
mc_backup_world
;;
server-backup)
mc_backup_server
;;
status)
mc_status
;;
update)
mc_update
;;
plugin-update)
mc_plugin_update
;;
restart-update)
as_user "${MC_SEND} 'stuff \"say SERVER WILL UPDATE! PLEASE LOGOUT!\"\015'"
mc_stop
mc_update
mc_start
;;
*)
echo "使い方: minecraft {start|stop|reload|rapidstop|restart|backup|server-backup|status|update|plugin-update|restart-update}"
esac
exit 0
@goodall-seiya
Copy link

すばらしい!ぜひ使わせていただきます!

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