本站文本内容除另有声明外,转载时均必须注明出处。(详情…本站文本内容除另有声明外,转载时均必须注明出处。(详情…中文Minecraft Wiki是完全公开的。请勇于扩充与修正内容!中文Minecraft Wiki是完全公开的。请勇于扩充与修正内容!Minecraft中文Wiki微博正在更新!或许有兴趣去看看Minecraft中文Wiki微博正在更新!或许有兴趣去看看想与其他用户进行编辑上的沟通?社区专页正是为此创建的。想与其他用户进行编辑上的沟通?社区专页正是为此创建的。翻译或创建页面之前,不妨看看译名标准化Wiki条例页面。翻译或创建页面之前,不妨看看译名标准化Wiki条例页面。需要管理员的协助?在管理员告示板留言也许可以帮到您。需要管理员的协助?在管理员告示板留言也许可以帮到您。

We are currently performing an upgrade to our software. This upgrade will bring MediaWiki from version 1.31 to 1.33. While the upgrade is being performed on your wiki it will be in read-only mode. For more information check here.

教程/服务器启动脚本

来自Minecraft Wiki
跳转至: 导航搜索
警告
因为这是Wiki的一个条目,可以在任何时间内被任何人编辑,因此建议你不要完全使用这个脚本,而是将其当作编写脚本的指导手册看待。


这是一个可供参考的 Minecraft 启动脚本示例,并使用 GNU/Linux distros 对脚本进行维护。

先决条件[编辑 | 编辑源代码]

  1. 必须安装 Screen 包。如果不安装 Screen,服务器进程将在断开服务器连接后被系统杀掉。

CentOS 和基于 Red Hat ® 系统的命令如下:

yum install screen

基于 Debian 系统(如 Ubuntu 等)的命令如下:

apt-get install screen

下载[编辑 | 编辑源代码]

要使用 wget 方法,运行下列脚本。(注意脚本需要修改 - 更改 WORLD、MCPATH 和 BACKUPPATH 变量)

重要:如果你使用 wget 方法,每行的第一个字符必须是空格,否则脚本不会工作,并且 update-rc.d 会输出错误。如果出现了,你不得不移除每行所有的前导空格。(注意不要删除过多的空格!)

wget -O minecraft "http://minecraft.gamepedia.com/Tutorials/Server_startup_script/Script?action=raw"
 #!/bin/bash
 # /etc/init.d/minecraft
 # version 0.4.1 2015-05-07 (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'
 SCREENNAME='minecraft_server'
 OPTIONS='nogui'
 USERNAME='minecraft'
 WORLD='world'
 MCPATH='/home/minecraft'
 BACKUPPATH='/media/remote.share/minecraft.backup'
 MAXHEAP=2048
 MINHEAP=1024
 HISTORY=1024
 CPU_COUNT=1
 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 ${SCREENNAME} $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 ${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
     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 ${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 "$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 ${SCREENNAME} -X eval 'stuff \"say SERVER SHUTTING DOWN IN 10 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 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 ${SCREENNAME} -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

需求[编辑 | 编辑源代码]

安装[编辑 | 编辑源代码]

使用你喜欢的编辑器在 /etc/init.d/ 目录里创建 minecraft 的文件,将上面的内容粘贴到那个文件里。

修改 USERNAME 和 MCPATH - 你安装时要使用的变量。如果你使用 Wrapper Script,更改 INVOCATION 来开始执行而不是直接启动服务器。

确保你新创建的文件得到了所需的权限,你可以通过运行下列命令设置权限:

chmod a+x /etc/init.d/minecraft

然后运行(在基于 Debian 系统的发行版上)

update-rc.d minecraft defaults

启动 Debian 6.0。如果使用 dependency-based 启动开启,则使用 insserv 命令替代。如果一切正常,insserv 将不会有任何的输出。如果你想确认哪个地方出错,检查 $? 里面的错误代码。

insserv minecraft

在 CentOs 和 RHEL(Redhat enterprise Linux)

你将会在 systemd 里向 chkconfig 列表的 chkconfig 启动脚本管理器添加过程。

chkconfig --add minecraft

要检查是否已正确添加过程,使用 ntsysv 命令,然后一直滚动,直到你看见有 minecraft 过程。如果你看不见,重复 chkconfig 命令,然后加上一些需要的符号链接。

注:你的系统更多时候会警告你脚本不能满足所有的需求,但是脚本仍然会工作。

你也可以在 crontab 里设置一个条目来备份服务器。

该示例 crontab 会每隔半小时进行备份:


  • 使用你想运行的用户账户,运行:
crontab -e

然后加上这个:

0,30 * * * * /etc/init.d/minecraft backup

如果因为你不知道如何使用 vi 而造成上面的效果不佳,尝试:

VISUAL=/usr/bin/nano crontab -e

卸载[编辑 | 编辑源代码]

(基于 Debian 的 GNU/Linux 发行版)

update-rc.d -f  minecraft remove

(在 CentOs/RHEL 里)

chkconfig --del minecraft

用法[编辑 | 编辑源代码]

在多数系统里,脚本可以通过命令运行。“(command)”为“stop”、“start”、“restart”命令,还可以为这些命令指定支持的参数。

/etc/init.d/minecraft (command)

在多数的 RedHat 或 Debian 分支发行版系统,可用 “service” 命令,其运行命令为:

service minecraft (command)

查看屏幕,使用:

screen -r

退出屏幕,使用:

CTRL+a+d

参考[编辑 | 编辑源代码]

附加信息[编辑 | 编辑源代码]

如果你想查看实时日志输出,在服务器目录里使用下列命令。

tail -f logs/latest.log

可选的服务器启动脚本[编辑 | 编辑源代码]

下列脚本与上面的脚本都包含了相同的功能,但是下面的脚本还带有了更多有用的功能: