マイクラサーバーをchkconfigに追加する。


今回は、先日立てたマイクラサーバーをchkconfigに追加したいと思います。
chkconfigに追加することによって、自動で起動するようになり、
24時間サーバーにすることができます。
それでは早速いきましょう。
1.前提となるプログラムの準備
2.起動スクリプトの作成、設定
3.chkconfigへの追加

1.前提となるプログラムの準備
yumで必要なものを準備します。

# yum install screen

通常Teratermなどの接続を切ると、処理は中断されてしまいますが、
screenを使用すれば、それを回避することができます。

2.起動スクリプトの作成、設定
起動スクリプトの準備をします。

# vi mc_server
 #!/bin/bash
 # /etc/init.d/minecraft
 # version 0.3.9 2012-08-13 (YYYY-MM-DD)

 ### BEGIN INIT INFO
 # Provides:   minecraft
 # Required-Start: $local_fs $remote_fs screen-cleanup
 # 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 server
 # Description:    Starts the minecraft server
 ### END INIT INFO

 #Settings
 SERVICE='minecraft_server.jar'       #サーバーの本体"xxx.jar"を記入
 OPTIONS='nogui'                   #GUIを使わない。基本いじらない
 USERNAME='minecraft'              #サーバーを実行するユーザー
 WORLD='world'                     #ワールド名
 MCPATH='/home/minecraft/minecraft'       #サーバーのホームディレクトリ
 BACKUPPATH='/media/remote.share/minecraft.backup'      #バックアップ先
 MAXHEAP=2048          #メモリの最大値
 MINHEAP=1024          #メモリの最低値
 HISTORY=1024
 CPU_COUNT=1           #CPUコアの数
 INVOCATION="java -Xmx${MAXHEAP}M -Xms${MINHEAP}M -XX:+UseConcMarkSweepGC \
 -XX:+CMSIncrementalPacing -XX:ParallelGCThreads=$CPU_COUNT -XX:+AggressiveOpts \
 -jar $SERVICE $OPTIONS" 

 ME=`whoami`
 as_user() {
   if [ $ME == $USERNAME ] ; then
     bash -c "$1"
   else
     su - $USERNAME -c "$1"
   fi
 }

 mc_start() {
   if  pgrep -u $USERNAME -f $SERVICE > /dev/null
   then
     echo "$SERVICE is already running!"
   else
     echo "Starting $SERVICE..."
     cd $MCPATH
     as_user "cd $MCPATH && screen -h $HISTORY -dmS minecraft $INVOCATION"
     sleep 7
     if pgrep -u $USERNAME -f $SERVICE > /dev/null
     then
       echo "$SERVICE is now running."
     else
       echo "Error! Could not start $SERVICE!"
     fi
   fi
 }

 mc_saveoff() {
   if pgrep -u $USERNAME -f $SERVICE > /dev/null
   then
     echo "$SERVICE is running... suspending saves"
     as_user "screen -p 0 -S minecraft -X eval 'stuff \"say SERVER BACKUP STARTING. Server going readonly...\"\015'"
     as_user "screen -p 0 -S minecraft -X eval 'stuff \"save-off\"\015'"
     as_user "screen -p 0 -S minecraft -X eval 'stuff \"save-all\"\015'"
     sync
     sleep 10
   else
     echo "$SERVICE is not running. Not suspending saves."
   fi
 }

 mc_saveon() {
   if pgrep -u $USERNAME -f $SERVICE > /dev/null
   then
     echo "$SERVICE is running... re-enabling saves"
     as_user "screen -p 0 -S minecraft -X eval 'stuff \"save-on\"\015'"
     as_user "screen -p 0 -S minecraft -X eval 'stuff \"say SERVER BACKUP ENDED. Server going read-write...\"\015'"
   else
     echo "$SERVICE is not running. Not resuming saves."
   fi
 }

 mc_stop() {
   if pgrep -u $USERNAME -f $SERVICE > /dev/null
   then
     echo "Stopping $SERVICE"
     as_user "screen -p 0 -S minecraft -X eval 'stuff \"say SERVER SHUTTING DOWN IN 10 SECONDS. Saving map...\"\015'"
     as_user "screen -p 0 -S minecraft -X eval 'stuff \"save-all\"\015'"
     sleep 10
     as_user "screen -p 0 -S minecraft -X eval 'stuff \"stop\"\015'"
     sleep 7
   else
     echo "$SERVICE was not running."
   fi
   if pgrep -u $USERNAME -f $SERVICE > /dev/null
   then
     echo "Error! $SERVICE could not be stopped."
   else
     echo "$SERVICE is stopped."
   fi
 } 

 mc_update() {
   if pgrep -u $USERNAME -f $SERVICE > /dev/null
   then
     echo "$SERVICE is running! Will not start update."
   else
     as_user "cd $MCPATH && wget -q -O $MCPATH/versions http://s3.amazonaws.com/Minecraft.Download/versions/versions.json"
        snap=`awk -v linenum=3 'NR == linenum {print; exit}' "$MCPATH/versions"`
        snapVersion=`echo $snap | awk -F'\"' '{print $4}'`
        re=`awk -v linenum=4 'NR == linenum {print; exit}' "$MCPATH/versions"`
        reVersion=`echo $re | awk -F'\"' '{print $4}'`
        as_user "rm $MCPATH/versions"
        if [ "$1" == "snapshot" ]; then
        MC_SERVER_URL=http://s3.amazonaws.com/Minecraft.Download/versions/$snapVersion/minecraft_server.$snapVersion.jar
        else
        MC_SERVER_URL=http://s3.amazonaws.com/Minecraft.Download/versions/$reVersion/minecraft_server.$reVersion.jar
        fi
     as_user "cd $MCPATH && wget -q -O $MCPATH/minecraft_server.jar.update $MC_SERVER_URL"
     if [ -f $MCPATH/minecraft_server.jar.update ]
     then
       if `diff $MCPATH/$SERVICE $MCPATH/minecraft_server.jar.update >/dev/null`
       then
         echo "You are already running the latest version of $SERVICE."
       else
         as_user "mv $MCPATH/minecraft_server.jar.update $MCPATH/$SERVICE"
         echo "Minecraft successfully updated."
       fi
     else
       echo "Minecraft update could not be downloaded."
     fi
   fi
 }

 mc_backup() {
    mc_saveoff

    NOW=`date "+%Y-%m-%d_%Hh%M"`
    BACKUP_FILE="$BACKUPPATH/${WORLD}_${NOW}.tar"
    echo "Backing up minecraft world..."
    #as_user "cd $MCPATH && cp -r $WORLD $BACKUPPATH/${WORLD}_`date "+%Y.%m.%d_%H.%M"`"
    as_user "tar -C \"$MCPATH\" -cf \"$BACKUP_FILE\" $WORLD"

    echo "Backing up $SERVICE"
    as_user "tar -C \"$MCPATH\" -rf \"$BACKUP_FILE\" $SERVICE"
    #as_user "cp \"$MCPATH/$SERVICE\" \"$BACKUPPATH/minecraft_server_${NOW}.jar\""

    mc_saveon

    echo "Compressing backup..."
    as_user "gzip -f \"$BACKUP_FILE\""
    echo "Done."
 }

 mc_command() {
   command="$1";
   if pgrep -u $USERNAME -f $SERVICE > /dev/null
   then
     pre_log_len=`wc -l "$MCPATH/logs/latest.log" | awk '{print $1}'`
     echo "$SERVICE is running... executing command"
     as_user "screen -p 0 -S minecraft -X eval 'stuff \"$command\"\015'"
     sleep .1 # assumes that the command will run and print to the log file in less than .1 seconds
     # print output
     tail -n $[`wc -l "$MCPATH/logs/latest.log" | awk '{print $1}'`-$pre_log_len] "$MCPATH/logs/latest.log"
   fi
 }

 #Start-Stop here
 case "$1" in
   start)
     mc_start
     ;;
   stop)
     mc_stop
     ;;
   restart)
     mc_stop
     mc_start
     ;;
   update)
     mc_stop
     mc_backup
     mc_update $2
     mc_start
     ;;
   backup)
     mc_backup
     ;;
   status)
     if pgrep -u $USERNAME -f $SERVICE > /dev/null
     then
       echo "$SERVICE is running."
     else
       echo "$SERVICE is not running."
     fi
     ;;
   command)
     if [ $# -gt 1 ]; then
       shift
       mc_command "$*"
     else
       echo "Must specify server command (try 'help'?)"
     fi
     ;;

   *)
   echo "Usage: $0 {start|stop|update|backup|status|restart|command \"server command\"}"
   exit 1
   ;;
 esac

 exit 0
#上部の一部を、自分の環境に合わせて設定してください。
# chmod a+x mc_server

これでスクリプトができました。
chkconfigに追加する前に、一度起動できるか確認しましょう。

# ./mc_server start
Starting bukkit.jar...
bukkit.jar is now running.   #起動成功
# ./mc_server stop
Stopping bukkit.jar
bukkit.jar is stopped.   #停止成功

3.chkconfigへの追加
chkconfigへ今作成したスクリプトを追加します。

# mv mc_server /etc/init.d/
# chkconfig --add mc_server
# chkconfig mc_server on
# chkconfig | grep mc_server
mc_server       0:off   1:off   2:on    3:on    4:on    5:on    6:off

これで完了です。再起動すれば、自動的に起動するでしょう。
手動で起動、停止、リロードしたい場合は下記のコマンド使用してください。

# service mc_server start
#service mc_server stop
#service mc_server reload

ServersMan@VPS サービスの詳細、申込はこちら



Raven について

あれこれ興味を持ったものを、ちょっと触ってすぐにやめちゃう、 どうしようもない状態です。orz 何か職になるくらいモノを身につけなければ・・・