Minecraft Wiki

除另有声明,转载时均必须注明出处若簡繁轉換出錯,請以遊戲內為準请勇于扩充与修正内容有兴趣逛逛我们的微博沟通交流,欢迎到社区专页需要协助,请在告示板留言

了解更多

Minecraft Wiki
Advertisement
Ic translate
此条目的(部分)内容需要翻译。

你可以帮助我们来翻译此条目,但请勿使用机器翻译

警告

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

Information icon
此特性为Java版独有。

这是一个使用了GNU/Linux发行版的Minecraft启动和维护脚本示例。

Systemd脚本

此方法适用于所有支持Systemd的现代服务器。Systemd是“万金油”,用于各种需求。Ubuntu在15.04版引入了它。(尽管这个版本有些老旧,但在此版本中Systemd能正常工作。)

安装

  1. 连接到你的(v)root服务器,或者如果要在你的机器上运行服务器,打开一个终端。
  2. 使用su或sudo更改为root用户。如果要检查是否为root,运行id -u。如果它返回0,那么你已经是root。
  3. 安装必须的包:apt install openjdk-8-jre-headless curl screen nano bash grep
  4. 如果不存在/opt目录,则创建它:mkdir /opt
  5. 现在你需要为此服务创建一个用户:adduser --system --shell /bin/bash --home /opt/minecraft --group minecraft
  6. 创建Systemd Unit文件:nano /etc/systemd/system/minecraft@.service,内容如下:
# Source: https://github.com/agowa338/MinecraftSystemdUnit/
# License: MIT
[Unit]
Description=Minecraft Server %i
After=network.target

[Service]
WorkingDirectory=/opt/minecraft/%i
PrivateUsers=true 
# Users Database is not available for within the unit, only root and minecraft is available, everybody else is nobody
User=minecraft
Group=minecraft
ProtectSystem=full 
# Read only mapping of /usr /boot and /etc
ProtectHome=true 
# /home, /root and /run/user seem to be empty from within the unit. It is recommended to enable this setting for all long-running services (in particular network-facing ones).
ProtectKernelTunables=true 
# /proc/sys, /sys, /proc/sysrq-trigger, /proc/latency_stats, /proc/acpi, /proc/timer_stats, /proc/fs and /proc/irq will be read-only within the unit. It is recommended to turn this on for most services.
# Implies MountFlags=slave
ProtectKernelModules=true 
# Block module system calls, also /usr/lib/modules. It is recommended to turn this on for most services that do not need special file systems or extra kernel modules to work
# Implies NoNewPrivileges=yes
ProtectControlGroups=true 
# It is hence recommended to turn this on for most services.
# Implies MountAPIVFS=yes

ExecStart=/bin/sh -c '/usr/bin/screen -DmS mc-%i /usr/bin/java -server -Xms512M -Xmx2048M -XX:+UseG1GC -XX:+CMSIncrementalPacing -XX:+CMSClassUnloadingEnabled -XX:ParallelGCThreads=2 -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=10 -jar $(ls -v | grep -i "FTBServer.*jar\|minecraft_server.*jar" | head -n 1) nogui'

ExecReload=/usr/bin/screen -p 0 -S mc-%i -X eval 'stuff "reload"\\015'

ExecStop=/usr/bin/screen -p 0 -S mc-%i -X eval 'stuff "say SERVER SHUTTING DOWN. Saving map..."\\015'
ExecStop=/usr/bin/screen -p 0 -S mc-%i -X eval 'stuff "save-all"\\015'
ExecStop=/usr/bin/screen -p 0 -S mc-%i -X eval 'stuff "stop"\\015'
ExecStop=/bin/sleep 10

Restart=on-failure
RestartSec=60s

[Install]
WantedBy=multi-user.target

#########
# HowTo
#########
#
# Create a directory in /opt/minecraft/XX where XX is a name like 'survival'
# Add minecraft_server.jar into dir with other conf files for minecraft server
#
# Enable/Start systemd service
#    systemctl enable minecraft@survival
#    systemctl start minecraft@survival
#
# To run multiple servers simply create a new dir structure and enable/start it
#    systemctl enable minecraft@creative
# systemctl start minecraft@creative

设置实例

现在你可以上传你的FTB Modpacks到名称为/opt/minecraft/的子文件夹。举个例子,你要把the modpack "FTB Beyond"放进"/opt/minecraft/FTBBeyond" (名称去掉空格). 如果你想运行vanilla instances,只需要在内部创建文件夹/opt/minecraft并且上传minecraft_server.jar并创建eula.txt文件(using: echo "eula=true" > /opt/minecraft/vanilla/eula.txt)。

在你上传minecraft server文件之后,确认"minecraft" is the owner and owning group. To do so just run "ls -la /opt/minecraft". If it is not, run "chown minecraft:minecraft /opt/minecraft/FTBBeyond". 你可能也需要完成安装。For current FTB packages you would run:

cd /opt/minecraft/FTBBeyond
echo "eula=true" > /opt/minecraft/FTBBeyond/eula.txt
su -c "/opt/minecraft/FTBBeyond/FTBInstall.sh" -s "/bin/bash" minecraft

启动/停止实例

你可以使用“systemctl start minecraft@FTBBeyond”来启动服务器器及用“systemctl stop minecraft@FTBBeyond”来关闭服务器。The part behind the “@”后的部分是一个示例名称,例如Folder Name。 这一脚本也会在你重启服务器时帮助自动停止你的Minecraft服务器。

自动启动

启用

systemctl enable minecraft@FTBBeyond

禁用

systemctl disable minecraft@FTBBeyond

Init.d脚本

作用于前代服务器,不支持Systemd。

先决条件

检查包必须被安装。
在CentOs及基于Red Hat的分布上:

yum install screen

在Ubuntu等基于Debian的系统上:

apt-get install screen python

下载

To download the script with wget, run the following (WATCH OUT SCRIPT NEEDS WORK - change the WORLD, MCPATH and BACKUPPATH variables.
Important: If you use the wget method and the first character of every line is an empty space, the script won't work and update-rc.d outputs errors. If so, you have to remove the leading empty spaces from each line. Be careful not to delete anything else than empty space though!)

wget -O minecraft "http://minecraft.gamepedia.com/Tutorials/Server_startup_script/Script?action=raw"
 #!/bin/bash
 # /etc/init.d/minecraft
 # version 0.4.2 2016-02-09 (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='/minecraft/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 --no-check-certificate https://launchermeta.mojang.com/mc/game/version_manifest.json"
     if [ "$1" == "snapshot" ] ; then
       JSONVERSION=`cd $MCPATH && cat versions | python -c "exec(\"import json,sys\nobj=json.load(sys.stdin)\nversion=obj['latest']['snapshot']\nfor v in obj['versions']:\n   if v['id']==version:\n    print(v['url'])\")"`
     else
       JSONVERSION=`cd $MCPATH && cat versions | python -c "exec(\"import json,sys\nobj=json.load(sys.stdin)\nversion=obj['latest']['release']\nfor v in obj['versions']:\n   if v['id']==version:\n    print(v['url'])\")"`
     fi
     as_user "cd $MCPATH && wget -q -O $MCPATH/versions --no-check-certificate $JSONVERSION"
     MC_SERVER_URL=`cd $MCPATH && cat versions | python -c 'import json,sys;obj=json.load(sys.stdin);print(obj["downloads"]["server"]["url"])'`
     as_user "rm $MCPATH/versions"
     as_user "cd $MCPATH && wget -q -O $MCPATH/minecraft_server.jar.update --no-check-certificate $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
 }

 mc_listen() {
   if pgrep -u $USERNAME -f $SERVICE > /dev/null ; then
     as_user "tail -f $MCPATH/logs/latest.log"
   else
     echo "$SERVICE is not running. Cannot listen to server."
   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
     ;;
   listen)
     mc_listen
     ;;
 
   *)
   echo "Usage: $0 {start|stop|update|backup|status|restart|command \"server command\"}"
   exit 1
   ;;
 esac
 
 exit 0

软件需求

  • screen
  • python (apt-get install python)

安装

Use your favorite editor to create file called minecraft in /etc/init.d/ and paste the script above in that file.

Edit the USERNAME and MCPATH -variables according to your setup. If you use a wrapper script, change INVOCATION to start it instead of starting the server directly.

Make sure the newly created file has required permissions You can set the permissions by running:

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

Then run (on Debian-based distributions)

update-rc.d minecraft defaults

Starting with Debian 6.0, the insserv command is used instead, if dependency-based booting is enabled. insserv will produce no output if everything went OK. Examine the error code in $? if you want to be sure.

insserv minecraft

On CentOs and RHEL(Redhat enterprise Linux) You will need to add the process into the chkconfig list chkconfig manages startup scripts under systemd

chkconfig --add minecraft

To check if the process is done correctly use the ntsysv command keep scrolling until you see the minecraft process if you don't repeat the chkconfig command. to add required symbolic links. Note: your system will most likely warn you that the script does not meet all requirements. The script will however work.

You can also setup an entry in your crontab to backup the server. A sample crontab to backup every half hour on the hour, and 30 minutes into the hour:

  • Using the user account you want the work done under, run:
crontab -e

and add this

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

If the above attempt went poorly because you do not know how to use vi, try:

VISUAL=/usr/bin/nano crontab -e

卸载

(In debian based GNU/Linux distribution)

update-rc.d -f  minecraft remove

(In CentOs/RHEL)

chkconfig --del minecraft

用法

The script may be invoked via the following command on most systems, where "(command)" will be "stop", "start", "restart", or any of the other options it supports.

/etc/init.d/minecraft (command)

On most RedHat- or Debian-based distribution where the `service` command is available, it should be invoked as:

service minecraft (command)

To view the screen, use:

screen -r

To exit the screen, use:

CTRL+a+d

参考

附加信息

If you still want to view the live log file, use this command in the server directory.

tail -f logs/latest.log

另一种启动脚本

以下的这些脚本提供的函数与上述脚本相同,但包含了更多有用的特性:

  • [Multi World] Minecraft Server Control Script
    • Run multiple Minecraft worlds.
    • Start, stop, and restart single or multiple worlds.
    • Create, delete, disable, and enable worlds.
    • Supports CraftBukkit in addition to the standard Mojang server distribution.
    • Users automatically notified of important server events.
    • Uses the Minecraft Query protocol to keep track of current server conditions.
    • LSB and systemd compatible init script, allows for seamless integration with your server's startup and shutdown sequences.
    • Map worlds using the Minecraft Overviewer mapping software.
    • Backup worlds, and remove backups older than X days.
    • Update the server software and installed addons.
    • Send commands to a world server from the command line.
  • minecraftd
    • Start, stop, and restart the server using either systemd or the script directly
    • Send commands to a server from the command line
    • Backup server (world, plugins, configuration, etc.), and purge old ones (configurable)
    • Suspend server if no player is logged in and bring it up as soon as one tries to join to maximazie efficiency
    • Purely written in bash and condensed features in about 500 lines of code to keep the foorprint small
    • Flexible configuration: support for e.g. spigot/craftbukkit, adjustable threads and RAM usage, etc.
    • Full systemd support with init and backup script
    • Secure resource usage: run script as different user and drop permissions if not requiered
    • Very similiar to the script described in this article: It as well uses screen and tar but offers more advanced features
    • Excellent Arch Linux support
  • Minecraft Systemd Service A nice systemd service that features:
    • safe shutdown using rcon
    • protection of the system by making most of the system readonly
    • uses systemd journal to log
    • can be combined with a nice commandcenter script
    • is fully integrated in the systemd-toolchain
  • minecraft init
    • modification of this script with a lot more features like multiworld
  • Mineserv Perl Init Script
    • A very simple automatic start/stop script with backup and cleanup functions and the ability to pass commands to the server console.
Advertisement