Tag

服务端

docker+mc的运维管理方案

Minecraft

之前在 一篇文章 中提到过docker部署minecraft服务器,后来发现并不好用,因为portainer免费版并没有很好的控制台管理方式,没有用户组之类的精确权限控制,同时也没有好用的文件管理方案,最终选择使用code-server来管理,在容器中安装tmux用于后台运行并随时打开控制台,同时还有vscode的好用文件管理

Dockerfile

bash
# ubuntu 作为基础镜像。
FROM ubuntu:24.04

# HTTP 代理
ENV HTTP_PROXY="http://172.17.0.1:7890"
# HTTPS 代理
ENV HTTPS_PROXY="http://172.17.0.1:7890"
# 针对 code-server/npm/git 等的全局代理(通常是小写的)
ENV http_proxy="http://172.17.0.1:7890"
ENV https_proxy="http://172.17.0.1:7890"
ENV NO_PROXY="localhost,127.0.0.1,::1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16"
# 时区
ENV TZ="Asia/Shanghai"

# 配置 APT 清华源
COPY aliyun-ubuntu.sources /etc/apt/sources.list.d/
RUN apt-get update

# 安装依赖
RUN DEBIAN_FRONTEND=noninteractive \
    apt-get install -y --no-install-recommends \
    curl \
    gosu \
    tmux \
    ca-certificates \
    iputils-ping \
    wget \
    zip \
    unzip \
    locales \
    && rm -rf /var/lib/apt/lists/*

# 设置编码
RUN locale-gen en_US.UTF-8 && update-locale LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8

# code-server
RUN curl -fsSL https://code-server.dev/install.sh | sh

COPY start.sh /
RUN chmod +x /start.sh

RUN useradd --shell /bin/bash -u 1001 -m mc
WORKDIR /home/mc

# 暴露端口
EXPOSE 8080
EXPOSE 25565

CMD ["/start.sh"]

start.sh

bash
#!/bin/bash
set -e

# 检查环境变量是否已设置
if [ -z "$SERVER_NAME" ]; then
    echo "Error: SERVER_NAME environment variable is not set correctly."
    exit 1
fi

# 修正文件归属
chown -R mc /home/mc

# ===============================================================
# 信号捕获函数:用于优雅关闭 MC Server
# ===============================================================
graceful_shutdown() {
    echo "Caught signal. Performing graceful shutdown..."
    
    # 检查 tmux session 是否存在
    if tmux has-session -t mc 2>/dev/null; then
        echo "Sending 'stop' command to Minecraft server via tmux..."
        
        # 使用 tmux send-keys 向 'mc' 会话发送 'stop' 命令和 Enter 键
        # -t mc: 指定目标会话
        # C-m: 相当于按下 Enter 键
        tmux send-keys -t mc 'stop' C-m
        
        # 等待 MC Server 进程退出。mc-server-runner 会处理 Java 的关闭
        # 我们可以等待 tmux session 消失,表示 mc-server-runner 已退出
        TIMEOUT=60
        COUNT=0
        while tmux has-session -t mc 2>/dev/null && [ $COUNT -lt $TIMEOUT ]; do
            echo "Waiting for Minecraft server to stop... (Max $TIMEOUT seconds)"
            sleep 1
            COUNT=$((COUNT + 1))
        done
        
        if [ $COUNT -eq $TIMEOUT ]; then
            echo "WARNING: Minecraft server did not stop gracefully within $TIMEOUT seconds. Killing tmux session."
            tmux kill-session -t mc 2>/dev/null
        else
            echo "Minecraft server stopped successfully."
        fi
    else
        echo "Minecraft server tmux session not found or already stopped."
    fi

    # 停止 code-server (exec 后的 code-server 已经是主进程,收到信号后会自动退出)
    # 我们这里不需要手动杀死 code-server,因为 Tini 会转发信号给它。
    # 退出脚本,允许 Tini 干净地清理进程
    exit 0
}

# 捕获 SIGINT (Ctrl+C) 和 SIGTERM (Docker Stop) 信号
trap 'graceful_shutdown' SIGINT SIGTERM

echo Starting Server...
cd /home/mc/$SERVER_NAME
gosu mc tmux new -d -s $SERVER_NAME
gosu mc tmux send-keys -t $SERVER_NAME:0 "$START_CMD" C-m

echo Starting Code...
gosu mc sed -i "s#^password: .*#password: $CODE_PASSWORD#" /home/mc/.config/code-server/config.yaml
gosu mc code-server --bind-addr 0.0.0.0:8080 /home/mc/$SERVER_NAME &
CODE_SERVER_PID=$!
echo "code-server started with PID $CODE_SERVER_PID."

# 等待 code-server 进程或收到的信号。
# 这一行是保持 start.sh 脚本存活的关键,以监听信号。
wait $CODE_SERVER_PID

# 如果 code-server 意外退出,则执行优雅关闭流程
graceful_shutdown

aliyun-ubuntu.sources

yaml
Types: deb
URIs: http://mirrors.aliyun.com/ubuntu
Suites: noble noble-updates noble-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

docker-compose.yml 使用示例(此处的镜像是本地构建的)

yaml
services:
  velocity:
    image: minecraft-universal:1.5
    container_name: velocity
    hostname: velocity
    environment:
      SERVER_NAME: "velocity"
      START_CMD: "./start.sh"
      CODE_PASSWORD: "<your-password>" 
    ports:
      - "25565:25565"
    volumes:
      - /opt/java:/java:ro
      - /opt/mc-velocity:/home/mc
    restart: unless-stopped
    networks:
      - mc
      - web

使用时需要先在映射的目录下创建目录,目录名字和环境变量中的SERVER_NAME一致,并在目录下添加 start.sh 以及其他服务器文件,对应compose中定义的启动指令

minecraft docker运行

Minecraft

今天研究了一下docker中运行minecraft,原因是希望在不给ssh的情况下允许别人进入服务器后台,因为已经部署了portainer,所以希望可以直接通过portainer操作后台

构建镜像

首先需要一个镜像来运行服务端

一开始我选择了Alpine作为底包,然后发现这个包实在是太干净了,甚至用的都不是glibc,下好的预编译的jdk没法跑,于是换了ubuntu

然后希望通过不同的目录来区分各个不同的子服,所以用环境变量+启动脚本动态选择工作目录

Dockerfile

dockerfile
# ubuntu 作为基础镜像。
FROM ubuntu:24.04

ENV TINI_VERSION=v0.19.0
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini
RUN chmod +x /tini

# 设置环境变量的默认值,这些值会被 docker-compose.yml 中的配置覆盖。
ENV SERVER_NAME=minecraft_server
ENV START_CMD="/java/bin/java -Xms1G -Xmx1G -jar server.jar --nogui"

# 设置容器内的通用工作目录。
WORKDIR /${SERVER_NAME}

# 暴露 Minecraft 服务器默认的 TCP 和 UDP 端口。
EXPOSE 25565

# 将启动脚本复制到镜像中。
COPY start.sh /start.sh

# 授权启动脚本可执行权限。
RUN chmod +x /start.sh

# 设置入口点。tini 确保当容器收到停止信号时,能优雅地关闭 Java 进程。
ENTRYPOINT ["/tini", "--"]

# 定义默认的启动命令。
CMD ["/start.sh"]

start.sh

bash
#!/bin/bash

# 检查环境变量是否已设置
if [ -z "$SERVER_NAME" ]; then
    echo "Error: SERVER_NAME environment variable is not set correctly."
    exit 1
fi

cd /$SERVER_NAME
echo "starting..."
exec $START_CMD
bash
# 构建指令
docker build -t minecraft-universal:1.0 .

docker compose

yaml
services:
  sc:
    image: minecraft-universal:1.2
    container_name: sc # 容器名字
    # 允许attach
    stdin_open: true
    tty: true
    ports:
      - "35565:25565" # 游戏端口映射,可以修改为其他端口
    environment:
      # 服务器名
      SERVER_NAME: "sc"
      START_CMD: "/java/bin/java -jar fabric-server-mc.1.21.8-loader.0.17.2-launcher.1.1.0.jar nogui"
    volumes:
      # 挂载宿主机的 Java 目录到容器中的 /java
      - /usr/local/jdk/21:/java
      # 挂载宿主机的服务器目录到容器中
      - ./sc:/sc
    restart: unless-stopped

使用如上配置之后可以在attach后正常和服务端控制台交互

重点是 stdin_open: truetty: true

Minecraft相关问题汇总

Minecraft

就是找个地方放一些问题的解决办法

客户端

切换音频输出后没有声音

原因:mc不会主动切换音频输出

解决办法:按f3+t重载材质包(不行的话试试重启)

服务端

cmd中不输出日志消息

原因:启动脚本里面用了javaw而不是java或者在脚本里面设置了其他的不该设置的选项

解决办法:使用正确的脚本启动,脚本示例

Paper Watchdog 报错

Minecraft

问题特征

使用paper及其分支核心,服务端长时间无响应时会由Watchdog打印线程转储信息

特征是有很长的一串报错,开头如下

log
[Paper Watchdog Thread/ERROR]: --- DO NOT REPORT THIS TO PAPER - THIS IS NOT A BUG OR A CRASH - git-Paper-xxx (MC: 1.1x.x) ---
[Paper Watchdog Thread/ERROR]: The server has not responded for 10 seconds! Creating thread dump

中间会出现多个类似以下结构的报错

[Paper Watchdog Thread/ERROR]: ------------------------------
[Paper Watchdog Thread/ERROR]: Current Thread: Timer hack thread
[Paper Watchdog Thread/ERROR]: 	PID: x | Suspended: false | Native: false | State: TIMED_WAITING
[Paper Watchdog Thread/ERROR]: 	Stack:
[Paper Watchdog Thread/ERROR]: 		xxxx.xxxx.xxxxxx.xxxxx(xxxx xxxx)
[Paper Watchdog Thread/ERROR]: ------------------------------

最后会进行插件和存档的保存消息,并且不会退出服务端的进程(会导致自动重启脚本失效)

这是由于服务端的进程未响应的时长超出了设置的限制,导致Watchdog打印线程转储信息并自动保存关闭

可能的导致原因

  • 某些插件的代码有bug导致主线程进入死循环
  • 粘液科技之类的插件
  • 玩家做的红石机器造成了过大的卡顿
  • 服务器配置太差

解决办法

寻找卡服根源

可以安装spark插件(指令教程),查看占用分析

自行寻找(可以二分法删插件),多看看日志可能有所帮助

升级硬件

大部分时候是升级CPU,cpu选择优先考虑单核水平,可以百度cpu天梯图查看单核排名

和多分配内存(分配过多内存并没有作用,多分配内存只是为了减小gc压力,cpu速度不够的时候并不能靠多分内存弥补)

修改watchdog的限制

治标不治本,该卡还会卡,仅在某些特殊情况(如预加载地图)下使用

找到 服务端文件夹/paper.yml (高版本在 服务端文件夹/config/paper-global.yml ),打开并找到以下选项

watchdog: early-warning-every: 5000 early-warning-delay: 10000

  • early-warning-every: 服务器无响应时打印线程转储之间的间隔(以毫秒为单位)
  • early-warning-delay: 服务器无响应后距离watchdog线程开始打印线程转储的毫秒数

将两个值改成你要的数值即可,注意单位是毫秒

崩溃&启动失败的日志/崩溃报告解析

Minecraft

日志

日志位于

  • 客户端:客户端文件夹/.minecraft/logs
  • 服务端:服务端文件夹/logs

文件夹中,最后一次启动的日志是 latest.log ,每当服务端启动时,旧的 latest.log 会被压缩到 年-月-日-次数.log.gz 文件中

如果你的启动脚本是带有自动重启的,并且你没有在它开始重启之前关闭它,那么 latest.log 就会被压缩到gz文件中

此时你需要找到对应的gz文件,使用解压缩软件查看其中的log文件

log文件可以直接用文本文档打开,通常有问题的日志应该从后往前看

崩溃报告

日志位于

  • 客户端:客户端文件夹/.minecraft/crash-reports
  • 服务端:服务端文件夹/crash-reports

文件夹中,崩溃报告的命名格式是 crash-年-月-日_时.分.秒-服务端/客户端.txt

崩溃报告中通常会带有

  • 崩溃原因的描述
  • 导致崩溃的报错
  • 崩溃时运算的实体
  • 服务器的存档信息
  • 服务器的版本
  • 服务器的JVM信息
  • 服务器的系统信息
  • MOD列表(mod服)

以下是一些常见的问题

mod前置未安装

Mod §eMOD名字§r requires §6前置名字§r §o前置版本 or above§r§7Currently, §6前置名字§r§7 is §o§nnot installed

解决办法:安装对应版本的前置

mod前置版本不合要求

Mod §e`MOD名字`§r requires §6`前置名字`§r §o需要的`前置版本` or above, and below `` 需要的`前置版本` ``§r§7Currently, §6`` `前置名字` ``xx§r§7 is §o当前`` 的`前置版本` ``

解决办法:安装对应版本的前置

Minecraft服务端地址

Minecraft

默认地址

Minecraft服务端的端口默认是25565,地址默认是127.0.0.1

客户端进入服务端需要填写 地址:端口 ,注意这里的地址和端口需要换成你自己的,并且冒号一定要用英文的 : ,否则会无法连接。当你认为自己其他地方没有问题的时候请检查一下冒号是否写错了

修改端口

端口在 服务端文件夹/server.properties 文件中修改,此文件可以直接用文本文档打开

在其中找到 server-port=25565 (其他port项不用管),将其中的25565调整到你需要的端口(如非必要,不要修改端口,游戏中加入服务器时,端口是25565的服务器的地址可以不写端口)

端口可用数值1-65535,其中0不使用,1-1023为系统端口,也叫BSD保留端口,1024-65535为用户端口,又分为:BSD临时端口(1024-5000)和BSD服务器(非特权)端口(5001-65535),建议使用五位数端口以防止端口冲突

修改端口后需要重启服务器生效,如果重启时控制台报错 **** FAILED TO BIND TO PORT! 就代表你选择的端口被其他进程占用了,需要更换端口

指定地址

默认地址127.0.0.1可以理解为本机,也就是当你服务端和客户端在一台机器上的时候可以使用此地址连接到服务端

在同一局域网中可以通过 服务端所在机器的ip:服务端端口 连接到服务端,例如( 192.168.1.1:25565

如果要跨公网连接的话有以下几种方式

  1. 有自己的公网ip(公网ip在哪儿,服务端的机器也要在哪儿,不要说有个vps然后要自己电脑开的服能远程连接,不现实)
  2. 使用frp,也就是内网穿透,教程
  3. 使用自己的动态公网ip,教程

常见问题

no further information

连接时出现

意为你填写的地址没有响应

可能原因有

  1. 地址有错误
  2. 防火墙没关闭
  3. 安装组未放行(vps)

如果是vps,请关闭系统防火墙并配置安全组放行

如果是第三方服务商提供的机器,可以找服务商询问

Unknow Host

大概率是地址写错了,请检查地址种的冒号是否是英文的冒号 :

原版客户端进Forge服

你需要使用mod一致的客户端连接服务器

连接中止

可能的原因有很多,你应该

  1. 检查你的客户端mod是否与服务端mod对应
  2. 检查你的服务端和客户端日志
  3. 如果你看不懂日志,请把完整的日志文件发给看得懂的人让他帮你(问的时候先提供日志并且详细地描述问题)

Minecraft服务端更换核心

Minecraft

保险起见,进行此操作前应该将服务端文件备份 (整个服务端文件夹打包或者复制一份都可)

以下所有操作均需要在关服时进行操作

服务端更新核心(不更换游戏版本)

将新的核心移动到服务端文件夹内

forge和fabric需要重新安装以下载需要的lib文件,单独复制核心并不能成功开服

然后修改开服脚本中的 -jar 参数后的核心名字

启动服务端后注意控制台,如果有报错需要注意

在确认没有问题后再删除旧的核心Jar文件

服务端更换核心

插件和mod是不互相兼容的,除非是没有安装插件或mod的情况下更换,否则不推荐

插件服和(mod服或插件mod服)互换核心时需要修改存档结构

修改方法

将新的核心移动到服务端文件夹内,然后修改开服脚本中的 -jar 参数后的核心名字

启动服务端后注意控制台,如果有报错需要注意

在确认没有问题后再删除旧的核心Jar文件

更换不同游戏版本的核心

如果是升级,1.12 -> 1.13,1.17 -> 1.18 等大更新不建议更换,及其容易出问题

如果是降级,想都别想

小更新将新的核心移动到服务端文件夹内,然后修改开服脚本中的 -jar 参数后的核心名字

启动服务端后注意控制台,如果有报错需要注意

在确认没有问题后再删除旧的核心Jar文件

Minecraft服务端换地图

Minecraft

保险起见,进行此操作前应该将服务端文件备份 (整个服务端文件夹打包或者复制一份都可)

客户端/官服存档结构

主世界中的区块存储在这个根文件夹中,下界则存储在子文件夹DIM-1中,末地则存储在DIM1中。每个维度都有其自己的datapoiregion文件夹。

https://wiki.biligame.com/mc/%E4%B8%96%E7%95%8C

具体存档结构见:https://wiki.biligame.com/mc/Java%E7%89%88%E4%B8%96%E7%95%8C%E6%A0%BC%E5%BC%8F

新的世界 ├─advancements ├─data ├─datapacks ├─DIM-1 下界 ├─DIM1 末地 ├─entities ├─playerdata ├─poi ├─region └─stats

插件服存档结构

服务端文件夹 ├─ world 主世界及存档通用数据文件 │ ├─ advancements │ ├─ data │ ├─ datapacks │ ├─ entities │ ├─ level.dat │ ├─ level.dat_old │ ├─ playerdata │ ├─ poi │ ├─ region │ ├─ session.lock │ ├─ stats │ └─ uid.dat ├─ world_nether 下界数据文件 │ ├─ data │ ├─ DIM-1 │ ├─ level.dat │ ├─ level.dat_old │ ├─ session.lock │ └─ uid.dat └─ world_the_end 末地数据文件 ├─ data ├─ DIM1 ├─ level.dat ├─ level.dat_old ├─ session.lock └─ uid.dat

MOD服存档结构

在原版的基础上可能会有其他维度的文件夹,一般是DIM-维度编号为名字的文件夹

更换地图

插件服和官服/mod服的存档互相更换时需要改变结构

插件服存档移动到官服/mod服/单机

world_netherworld_the_nether 中的DIM开头的文件夹移动到 world 文件夹中

然后将world文件夹整个移动到服务端中

反之,新建 world_netherworld_the_nether 文件夹,将DIM开头的文件夹移动到其中

注意,mod创建的维度无法移动到插件服,多世界插件创建的维度和主世界在迁移时仅可保留一个作为主世界(可以拆成一个单独的存档)

MinecraftMOD服安装/配置MOD

Minecraft

找mod

mod一般发布在curseforge上 https://www.curseforge.com/minecraft/modpacks (此网站国内不墙,但是访问需要过人机验证)

国内找mod推荐mc百科 https://www.mcmod.cn/modlist.html mod搬运较多;相比mcbbs的mod板块多了搜索功能,搜索功能完善,筛选条件够多,并且介绍/物品/教程都较全,格式规范;但是更新会有延迟,下载并不是都有,一般是找到mod之后通过其中的连接跳转到cursegorge下载最新版

mcbbs的mod板块 https://www.mcbbs.net/forum-mod-1.html

安装mod

首先分清楚客户端mod和服务端mod(mc百科的介绍界面有标注)

客户端mod是只在客户端生效的mod,在服务端毫无作用还有极大几率在启动时出错导致崩溃

一般添加了汉化,特效,修改了渲染等的mod就是服务端mod

例如小地图,optifine高清修复,血条,jei等

服务端mod分为纯服务端使用的服务端mod和客户端和服务端都使用的服务端mod

一般添加了新物品,新生物,新游戏机制的就是服务端mod

例如暮色森林,匠魂,工业等

纯服务端mod一般是指在服务端生效,且不需要客户端安装的mod(客户端可装可不装)

纯服务端mod比较少见,除非mod发布页面写了只需要服务端安装,否则都按服务端mod处理

例如平坦基岩生成

将mod加入mods文件夹 服务端文件夹/mods 然后重启服务端

配置mod

更新mod

如果mod作者没有注明需要操作什么,一般就是将旧的mod的Jar删除后将新的mod的Jar放进mods文件夹

汉化mod

mod的jar文件使用压缩软件打开,找到 assets/mod名字/lang 文件夹,其中会有一个或多个json文件,如果缺少zh_cn.json的话这个mod就无法显示中文的内容

此操作需要在客户端/服务端关闭的情况下进行

此时可以到网上找找有没有mod的汉化,如果没有并且想要自己汉化mod的可以将en_us.json复制一份出来,将其中的 "xxxx.xxx.xx": "yyyyyyyyyyyy" 格式的一段中的yyyyyyyyyyyy内容替换成中文内容,注意不要有json语法错误

推荐使用vscode并且安装json插件进行编辑

替换完成后保存并关闭,将此文件命名为zh_cn.json,然后放进上面在mod的Jar文件中找到汉化文件的文件夹中

此方法也可用于汉化光影包

Minecraft插件服安装/配置插件

Minecraft

找插件

插件一般发布在spigot上 https://www.spigotmc.org/search/?type=resource_update (此网站国内不墙,只有5秒的ddos检测)

国内找插件可以去mcbbs,搬运的插件一般都会汉化用法和配置文件,提供明确的获取方式 https://www.mcbbs.net/forum-servermod-1.html

安装插件

插件服的插件基本通用,版本向前兼容(比如支持1.13的插件,如果没有描述,多半支持1.14及以后的版本)

下载插件得到插件的jar文件后将jar文件移动到插件服的plugins文件夹中,然后重启服务端

如果启动时没有报错,并且启动完之后在控制台输plugins看到插件名字并且是绿字说明插件启动/安装成功

配置插件

使用汉化的语言/配置文件

汉化的语言文件有多种可能的使用方式

  1. 插件配置文件夹中有默认的语言文件,替换掉它
  2. 插件有语言文件夹,将语言文件(文件中带zh_CN或者类似的标识)放进去,然后在配置文件中搜索lang,找到后替换语言代码(一般为zh_CN)
  3. 插件自带汉化,在配置文件中搜索lang,找到后替换语言代码(一般为zh_CN)

配置文件的汉化一般是汉化了其中的注释,如果汉化文件不是最新的,建议对照着旧文件改插件自动生成的配置文件,否则可能会有错漏导致不可预知的后果

查看默认配置文件

插件的Jar文件使用压缩软件打开,里面会有默认的配置文件(注意不要修改其中的默认文件,复制出来即可)

此方法可以查看其自带的语言文件是否有自己需要的,以及它使用的语言代码格式

更新插件

如果插件作者没有注明需要操作什么,一般就是将旧的插件Jar删除后将新的插件Jar放进plugins文件夹

一些插件的链接

EssentialsX(包括本体和Protect,Chat,Spawn):提供大部分的基础指令和对玩家限制。使用时需要手动给default组添加权限。注意需要下载带X的版本

mcbbs:https://www.mcbbs.net/thread-619883-1-1.html

中文Wiki:https://mineplugin.org/Essentials

官网:https://essentialsx.net/

英文Wiki:https://essentialsx.net/wiki/Home.html

构建:https://ci.ender.zone/job/EssentialsX/

GitHub:https://github.com/EssentialsX/Essentials/

Luckperms:提供权限组管理,个人认为比GroupManager好用,安装完第一次启动可能比较慢,请耐心等待

mcbbs:https://www.mcbbs.net/thread-676818-1-1.html

官网:https://luckperms.net/

中文Wiki:https://pluginscdtribe.github.io/wiki/luckperms/

构建:https://ci.lucko.me/job/LuckPerms/

GitHub:https://github.com/lucko/LuckPerms/

AuthMeReloaded(开发版):提供登录功能,替代正版验证

mcbbs:https://www.mcbbs.net/thread-442729-1-1.html

官网:https://www.spigotmc.org/resources/authme-reloaded.6269

英文Wiki:https://github.com/AuthMe/AuthMeReloaded/tree/master/docs

构建:https://ci.codemc.io/job/AuthMe/job/AuthMeReloaded/

GitHub:https://github.com/AuthMe/AuthMeReloaded/

CoreProtect:记录玩家的几乎所有操作,提供按区域/玩家/时间回档的功能,防熊利器,但是要定期清理,不然会很占储存

mcbbs:https://www.mcbbs.net/thread-682499-1-1.html

官网:https://www.spigotmc.org/resources/coreprotect.8631/

中文Wiki:https://mineplugin.org/CoreProtect

Residence:领地插件,允许玩家圈地以保护自己的房屋农田等建筑。虽然是付费插件,但是提供了免费版下载,会限制在63格以上高度放置流体和中立方块,一定要手动关闭,方法见mcbbs帖子

mcbbs:https://www.mcbbs.net/thread-631343-1-1.html

官网:https://www.spigotmc.org/resources/residence-1-7-10-up-to-1-16.11480/

免费下载:https://zrips.net/Residence/

Github:https://github.com/Zrips/Residence

Vault:经济及部分插件的前置

官网:https://www.spigotmc.org/resources/vault.34315/

mcbbs(旧版本,仅供参考):https://www.mcbbs.net/thread-703488-1-1.html

中文Wiki:https://mineplugin.org/Vault

XConomy:经济插件,国产插件,作者修bug快,也可以用其他的经济插件代替

mcbbs:https://www.mcbbs.net/thread-962904-1-1.html (包含Wiki)

spigot:https://www.spigotmc.org/resources/xconomy.75669/

GitHub:https://github.com/YiC200333/XConomy

Skinsrestorer:皮肤插件,允许离线服务器显示正版皮肤(没办法,谁叫国内离线玩家多)

mcbbs:https://www.mcbbs.net/thread-805404-1-1.html

官网:https://www.spigotmc.org/resources/skinsrestorer.2124/

英文Wiki:https://github.com/SkinsRestorer/SkinsRestorerX/wiki

GitHub:https://github.com/SkinsRestorer/SkinsRestorerX

PlaceholderAPI:占位符变量,返回你需要的玩家数据,很多插件的软前置

mcbbs:https://www.mcbbs.net/thread-829732-1-1.html

官网:https://www.spigotmc.org/resources/placeholderapi.6245/

中文Wiki:https://mineplugin.org/PlaceholderAPI

LockettePro:木牌箱子锁

和LWCX相比牌子会占用一格空间,且给予的信任人数有上限,要给很多信任时建议使用圈地,但是使用简单

mcbbs(旧版本,仅供参考):https://www.mcbbs.net/thread-944015-1-1.html

官网:https://www.spigotmc.org/resources/lockettepro-for-1-14-1-15-1-16.74354/

GitHub:https://github.com/brunyman/LockettePro

英文Wiki:https://github.com/connection-lost/LockettePro/wiki

LWCX:箱子锁

和LockettePro相比不会有牌子占用一格空间,添加信任的数量无上限,容器放下即锁

mcbbs(旧版本,仅供参考):https://www.mcbbs.net/thread-892322-1-1.html

官网:https://www.spigotmc.org/resources/lwc-extended.69551/

GitHub:https://github.com/pop4959/LWCX

构建:https://ci.codemc.io/job/pop4959/job/LWCX-dev/

英文Wiki:https://github.com/pop4959/LWCX/wiki

Multiverse-Core:多世界插件,方便管理多个世界,是部分插件的前置

mcbbs:https://www.mcbbs.net/thread-1016455-1-1.html

官网:https://dev.bukkit.org/projects/multiverse-core(可能需要魔法上网)

中文Wiki:https://mineplugin.org/Multiverse-Core

构建:https://ci.onarandombox.com/job/Multiverse-Core/

GitHub:https://github.com/Multiverse/Multiverse-Core/

QuickShop Reremake:商店插件,允许使用箱子,末影箱等容器作为商店出售或收购物品

mcbbs:https://www.mcbbs.net/thread-809496-1-1.html(包含wiki)

官网:https://www.spigotmc.org/resources/quickshop-reremake-1-16-ready-say-hello-with-rgb.62575/

构建:https://ci.codemc.io/job/Ghost-chu/job/QuickShop-Reremake/

GitHub:https://github.com/Ghost-chu/QuickShop-Reremake

PlayerTitle:称号,国产插件

mcbbs:https://www.mcbbs.net/thread-1004671-1-1.html

spigot:https://www.spigotmc.org/resources/playertitle.78048/

FarmProtect:保护农田不被踩坏

mcbbs(旧版本,仅供参考):https://www.mcbbs.net/thread-797619-1-1.html

spigot:https://www.spigotmc.org/resources/farmprotect.6259/

Lite Sign In:签到,国产插件

mcbbs:https://www.mcbbs.net/thread-1056080-1-1.html

spigot:https://www.spigotmc.org/resources/lite-sign-in-1-7-1-16-sign-in-rewards-chest-gui-mysql-sqlite-customizable.79584/

Citizens:NPC插件

mcbbs:https://www.mcbbs.net/thread-797288-1-1.html(带wiki)

spigot:https://www.spigotmc.org/resources/citizens.13811/

Citizens CMD:点击NPC使用指令

mcbbs:https://www.mcbbs.net/thread-1002989-1-1.html

spigot:https://www.spigotmc.org/resources/citizens-cmd.30224/

TrMenu:菜单(2.0版本付费,但是GitHub有下载)

mcbbs:https://www.mcbbs.net/thread-918078-1-1.html

GitHub:https://github.com/TrMenu/TrMenu/actions

TrChat:修改聊天格式

mcbbs:https://www.mcbbs.net/thread-903335-1-1.html

Github:https://github.com/Arasple/TrChat/releases/tag/1.71

TrHologram:悬浮字

mcbbs:https://www.mcbbs.net/thread-923397-1-1.html

Github:https://github.com/Arasple/TrHologram/releases

Plotsquared:地皮

mcbbs:https://www.mcbbs.net/thread-573771-1-1.html

spigot:https://www.spigotmc.org/resources/plotsquared-v5.77506/

MiniMOTD:修改motd

mcbbs:https://www.mcbbs.net/thread-1075003-1-1.html

spigot:https://www.spigotmc.org/resources/minimotd-server-list-motd-plugin-with-rgb-gradients.81254/

TitleManager:修改玩家tab样式和右侧计分板

mcbbs:https://www.mcbbs.net/thread-810394-1-1.html

spigot:https://www.spigotmc.org/resources/titlemanager.1049/

ViaVersion:跨版本,允许其他版本的客户端进入服务器

mcbbs:https://www.mcbbs.net/thread-1023597-1-1.html

spigot:https://www.spigotmc.org/resources/viaversion.19254/

ViaBackwards:跨版本,兼容更低的版本

mcbbs(旧版本,仅供参考):https://www.mcbbs.net/thread-698692-1-1.html

spigot:https://www.spigotmc.org/resources/viabackwards.27448/

LaggRemover:优化

mcbbs(旧版本,仅供参考):https://www.mcbbs.net/thread-715006-1-1.html

官网:https://dev.bukkit.org/projects/laggremover  (可能需要魔法上网)

ScriptBlockPlus:脚本方块,点击/踩踏/挖掘时使用指令

mcbbs:https://www.mcbbs.net/thread-691900-1-1.html

spigot:https://www.spigotmc.org/resources/1-9-1-16-x-scriptblockplus-mechanics.78413/

VeinMiner:连锁挖矿

mcbbs:https://www.mcbbs.net/thread-600757-1-1.html

spigot:https://www.spigotmc.org/resources/veinminer.12038/

Marriage Master:结婚

mcbbs:https://www.mcbbs.net/thread-905947-1-1.html

spigot:https://www.spigotmc.org/resources/marriage-master-mc-1-7-1-16.19273/

IronElevators:铁块电梯

mcbbs:https://www.mcbbs.net/thread-612833-1-1.html

spigot:https://www.spigotmc.org/resources/ironelevators-1-4-6-1-16.19451/

Minecraft服务端配置文件

Minecraft

server.properties

这个文件是所有服务端(上面列出的主流服务端)都会生成的一个配置文件,位于核心Jar文件同级目录中

一些基础的参数需要在此文件中设置,下面会列出一些常用参数的用法(以1.16的为参考)

  1. allow-flight=false 允许玩家在安装添加飞行功能的mod前提下在生存模式下飞行
  2. allow-nether=true 允许玩家进入下界
  3. difficulty=easy 定义服务器的游戏难度
  4. enable-command-block=false 是否启用命令方块
  5. level-seed= 种子
  6. level-type=default 地图所生成的类型 default:标准的世界 flat:超平坦 largebiomes:巨大生物群系
  7. max-players=20 最大玩家数量
  8. max-tick-time=60000 最大刻时长,单位毫秒,当一个游戏刻的时长超过此数值后游戏会强行停止并崩溃(paper会保存存档、插件数据),设置为-1以禁用
  9. motd=A Minecraft Server 多人游戏界面服务器的信息
  10. online-mode=true 在线模式,设置为false允许离线模式的玩家进入服务器
  11. pvp=true 玩家pvp
  12. server-ip= 服务器ip,如果你不是清楚地知道你在改什么,让它留空,不要动它
  13. server-port=25565 服务器端口,如果你要开两个服务端或者有其他程序占用了25565端口的话可以自行修改
  14. view-distance=10 服务端视距,如果卡顿的话可以减小该值,可以设置为6
  15. white-list=false 白名单,如果开启,没有添加过白名单的玩家将会无法进入服务器,如果是离线模式的服务器,添加白名单的玩家必须进入过服务器,否则即使添加了白名单,此玩家也无法进入服务器(离线服务器建议用插件或mod实现白名单)

未列出的内容见 https://minecraft.fandom.com/zh/wiki/Server.properties#Java.E7.89.88_3

bukkit.yml

基于bukkit的服务端会生成此文件,位于核心Jar文件同级目录中

配置参考wiki(英文) https://bukkit.gamepedia.com/Bukkit.yml

spigot.yml

基于spigot的服务端会生成此文件,位于核心Jar文件同级目录中

配置参考wiki(英文) https://www.spigotmc.org/wiki/spigot-configuration/

paper.yml

基于paper的服务端会生成此文件,位于核心Jar文件同级目录中

参考wiki(英文) https://paper.readthedocs.io/en/latest/server/configuration.html

中文参考

以上文件的部分内容汉化+优化参考 https://www.mcbbs.net/thread-478126-1-1.html

插件配置

插件的配置文件一般都会生成在plugins文件夹中的插件同名文件夹内

一般使用yml文件作为配置文件,具体配置方法看插件发布贴作者的说明

yml文件可以直接用文本文档打开,但是没有语法高亮,推荐使用vscode并添加yaml插件

yml语法 https://www.runoob.com/w3cnote/yaml-intro.html (推荐小白看一看,只要了解基础的语法即可)

如果reload时配置文件有语法错误,后台会报一长串错误,并且指令的返回消息可能不会正常显示

mod配置

mod的配置一般在config文件夹中的mod名开头的文件/文件夹中,1.12前文件格式为cfg,之后为toml

一般文件中会有英文注释,如果看不懂不要乱改(先去机翻

这两种文件都可以直接用文本文档打开,但是没有语法高亮,推荐使用vscode并添加对应插件

Minecraft服务端搭建与运行

Minecraft

安装Java

开服需要安装Java (64位机器装64位Java)

安装Java教程

获取核心

首先选择自己要使用的核心和游戏版本

新建一个文件夹,确保其路径没有中文

下载核心后移动到此文件夹

此处注意,forge和fabric的核心是需要通过安装获得的,其他核心大多是一个单独的Jar文件,会自动下载需要的lib文件

移动核心时

  • forge请连着 libraries 文件夹一起
  • fabric请连着 .fabric.fabric-installer 两个文件夹一起

启动

官服的jar文件可以双击打开,但是其他的核心据我所知均需要使用开服脚本,开服脚本教程

现在的文件夹中应该有核心和启动脚本两个文件

win双击start.bat启动服务器,linux在命令行中输入./start.sh (无法执行的看脚本教程中的添加权限)

启动之后如果是没有自动重启的脚本会一闪然后关闭,此时文件夹中会自动生成 eula.txt

打开 eula.txt ,将其中的 false 改成 true (注意不要打错单词),保存并关闭

此时再启动脚本,服务端会正常启动

Minecraft服务端核心介绍及链接

Minecraft

本教程仅包含Java版的核心,基岩版不在此教程范围内

官服

Mojang官方发布的服务端,不支持插件/MOD,只支持数据包

因为Mojang网站的下载不好找并且只有最新版,所以这里放一个第三方的下载链接收集站

https://mcversions.net/

插件服

插件服是只能使用插件(Plugin)的服务端核心,包括以下几个主流的核心

插件服的插件基本通用,版本向前兼容(比如支持1.13的插件,如果没有描述,多半支持1.14及以后的版本)

  1. Bukkit https://getbukkit.org/
  2. Spigot(Bukkit的分支) https://www.spigotmc.org/ (不提供最新版下载,可以自行构建或寻找第三方构建站)
  3. Paper(Spigot的分支|优化性能) https://papermc.io/downloads (粘性活塞刷物品需要手动配置paper.yml启用,刷沙机不可用,配置方法见/blog/服务端配置/
  4. Airplane(Paper的分支|优化性能) https://ci.tivy.ca/
  5. Purpur(Paper的分支|性能最好) https://purpur.pl3x.net/downloads/
  6. 其他基于Bukkit的插件服

MOD服

MOD服是只能使用MOD的服务端核心,根据加载器的不同,分为以下两种核心

  1. Forge https://files.minecraftforge.net/net/minecraftforge/forge/
  2. Fabric https://fabricmc.net/use/

两者的mod不互通(作者标注了互通的除外)

注意,使用MOD服核心时客户端连接服务端需要

  1. 服务端和客户端的加载器版本(Forge/Fabric版本)一致
  2. 服务端和客户端的服务端MOD一致
  3. 服务端和客户端的服务端MOD版本一致

插件MOD服

同时支持插件和mod的服务端核心,有以下特点

  1. 性能比纯插件/MOD服差
  2. 并非兼容所有插件和mod(不兼容不一定是不能加载,也可能是某个功能不可使用/使用时出现异常)
  3. 客户端的连接同样需要满足和上述mod服相同的条件
  4. 新手服主强烈不建议使用

包括以下几个主流核心

  1. Mohist (使用Forge的mod和Bukkit插件,支持高版本) https://mohistmc.com/download/
  2. Arclight (使用Forge的mod和Bukkit插件,支持高版本) https://github.com/IzzelAliz/Arclight/releases
  3. CatServer (使用Forge的mod和Bukkit插件,仅支持1.12.2) https://catmc.org/
  4. Magma (使用Forge的mod和Bukkit插件,写此教程时尚未支持1.16) https://github.com/magmafoundation/Magma
  5. Sponge (使用Forge的mod和Sponge插件,仅支持1.12.2) https://www.spongepowered.org/

Minecraft服务端教程目录

Minecraft

本教程只讲Java版的核心,基岩版不在此教程范围内

搭建服务端相关

核心介绍

核心是开服所必备的东西,种类繁多,这里对其做简单的分类和介绍

开服脚本

一般开服的设置都比较多,每次都用命令行启动非常麻烦,所以使用脚本

安装Forge

Forge是一种mod加载器,安装了Forge,才可以使用mod(forge的mod)

安装Fabric

Fabric是新出来(相比较Forge)的一种加载器 ,安装了Fabric,才可以使用mod(fabric的mod)

搭建服务端

从零开始搭建一个服务端

配置服务端

搭建完服务端之后对齐进行配置(服务端/插件/mod)

插件相关

插件的安装和配置

mod相关

mod的安装和配置

其他开服相关

更换核心

从一个核心换到另一个核心,或者是更新核心

更换地图

更换地图

地址/端口

端口配置和常见连接服务器失败的解决办法

内网穿透

通过内网穿透使不在一个局域网中的朋友也能链接服务端

DDNS动态解析域名

使用ddns而不是内网穿透,带宽上限就是自己网络的带宽上限,少一个中转,延迟也会更低

日志/崩溃报告

日志/崩溃报告怎么看

Minecraft开服脚本

Minecraft

总是有人不看完就跑来问我,所以把常见问题及其解决办法放到最上面

常见问题

Unrecognized VM option 'xxx'

这里是你使用的开服脚本中的某个参数,不被你的Java接受

xxx可能是 +AggressiveOpts 也可能是 +UseCompressedOops 或者是你启动脚本中的其他不被接受的参数

解决办法:

将开服脚本中的包含xxx的那一段参数删除

Unrecognized VM option '+AggressiveOpts' 就删除 -XX:+AggressiveOpts

Unrecognized VM option ' +UseCompressedOops ' 就删除 -XX:+UseCompressedOops

Could not reserve enough space for object heap

设置了过大的内存

解决办法:

将开服脚本中的内存调小(注意,32位java的可用内存受限制,只能使用最大1.4G到1.6G的内存,解决办法是更换64位的Java)

将参数换成 -Xmx1G -Xms1G

内存分配一般是给系统所有可用内存大小的2/3(给系统和其他应用留出空间),如果你电脑的内存低于1G,就不要想着开服了

页面文件太小,无法完成操作

设置了过大的内存

解决办法:

将开服脚本中的内存调小(注意,32位java的可用内存受限制,只能使用最大1.4G到1.6G的内存,解决办法是更换64位的Java)

将参数换成 -Xmx1G -Xms1G

内存分配一般是给系统所有可用内存大小的2/3(给系统和其他应用留出空间),如果你电脑的内存低于1G,就不要想着开服了

1.17及以后版本使用了低于Java16的Java

Forge的报错 Forge的报错 Fabric的报错 Fabric的报错 Paper的报错 Paper的报错 Spigot的报错 Spigot的报错

只要出现了以上图片中类似的报错,就意味着你需要使用Java16

解决办法:(二选一)

  1. 在启动脚本中指定Java路径(推荐)(方法见上面指定Java的脚本)
  2. 卸载其他版本的Java,只留Java16(不推荐)

1.16及以前版本使用了高于(包括)Java16的Java

只要出现了以上图片中类似的报错,就意味着你需要使用Java16之前的版本(不包括Java16,Java8/11等LTS版本都是不错的选择)

解决办法:(二选一)

  1. 在启动脚本中指定Java路径(推荐)(方法见上面指定Java的脚本)
  2. 卸载其他版本的Java,只留Java8/11(不推荐)

注意

本教程中均以server.jar作为核心名字,实际使用时请手动改成你的服务端核心jar名字

开服需要安装Java (64位机器装64位Java)

安装Java教程

通用

开服所用的指令就一条,一般是java开头的那一条,其他部分都是起辅助作用的,比如设置cmd窗口标题、自动重启等

这里拿一个典型的开服指令举例 java -Xmx2G -Xms2G -jar server.jar nogui

这里的 server.jar 是示例,实际使用时请手动改成核心jar的名字

Java

橙色字 java 意为使用可执行文件java,一般java需要在path中(设置path linux win),如果需要指定使用的java的话需要修改path中的java或者使用绝对路径

脚本使用绝对路径指定使用的java(点击展开)

以下的红字为修改的内容
如果你已经有开服命令了,只需要单独替换开头的 java

windows
假设java路径位于 C:\Program Files\Java\jdk1.8.0_301\bin\java
一般的脚本 java -Xmx2G -Xms2G -jar server.jar nogui
需要改为 "C:\Program Files\Java\jdk1.8.0_301\bin\java" -Xmx2G -Xms2G -jar server.jar nogui
linux(不知道是啥的不需要看)
假设java路径位于 /usr/local/jdk1.8.0_301/bin/java
一般的脚本 java -Xmx2G -Xms2G -jar server.jar nogui
需要改为 /usr/local/jdk1.8.0_301/bin/java -Xmx2G -Xms2G -jar server.jar nogui

JVM参数

红色字 -Xmx2G -Xms2g -jar 是jvm参数

设置jvm参数是开服非常重要的一环,使用的最大内存,最小内存,优化参数等都是jvm参数

-Xmx2G 设置最大可用内存为2G,这里红字的2G可以替换成其他内存大小,单位除了G之外可以用M,例如 -Xmx256M

-Xms2G 设置初始内存为2G,这里红字的2G可以替换成其他内存大小,单位除了G之外可以用M,例如 -Xms256M

-jar 意为通过jar文件启动,后面需要接文件名字,如果后面接的jar文件名字错误或者jar文件损坏则会报错

其他优化参数见 https://aikar.co/2018/07/02/tuning-the-jvm-g1gc-garbage-collector-flags-for-minecraft/

MC服务端参数

紫色字 nogui 意为不显示mc自带的ui界面,不管是否添加此参数,服务端始终会将日志输出至命令行

自带的UI界面效果如下(下图是paper的,和原版略有区别)

Windows

创建脚本

在服务端文件夹新建一个txt文件,将其改名为start.bat

若文件没有显示默认的txt扩展名

编辑脚本

右键bat文件,点击编辑

打开后输入下方的开服代码

如果是新建的脚本,文件>另存为 下方的编码选择ANSI,否则中文会乱码,保存

WIN脚本示例

bat
@ECHO OFF
@REM 作者404E
set a=0
echo ------------------------------------------------------------------
echo --                                                              --
echo --                           正在启动                           --
echo --                                                              --
echo ------------------------------------------------------------------
:start
set b = %date:~0,4%.%date:~5,2%.%date:~8,2% %time:~0,2%:%time:~3,2%:%date:~8,2%
title 服务端 重启%a%次 上次重启于%b%
set date1=%date:~0,4%%date:~5,2%%date:~8,2%
set time1=%time:~0,2%%time:~3,2%%time:~6,2%
java -Xms2G -Xmx2G -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true -jar server.jar nogui
set date2=%date:~0,4%%date:~5,2%%date:~8,2%
set /a c=%time:~0,2%%time:~3,2%%time:~6,2% - %time1%
if %c% LEQ 1 (
    if %date2% == %date1% (
        echo ------------------------------------------------------------------
        echo --                                                              --
        echo --                  :( 启动异常,请检查启动参数                  --
        echo --                  或者咨询其他人,按任意键退出                 --
        echo --                                                              --
        echo ------------------------------------------------------------------
        pause>null
        exit
    )
)
set /a a=%a%+1
echo ------------------------------------------------------------------
echo --                                                              --
echo --                       将在3秒后自动重启                      --
echo --                       按任意键跳过等待                       --
echo --                      或者直接关闭服务端                      --
echo --                                                              --
echo ------------------------------------------------------------------
timeout /T 3
goto start

以上是我用的脚本,优化参数 https://aikar.co/2018/07/02/tuning-the-jvm-g1gc-garbage-collector-flags-for-minecraft/

Linux步骤

创建&编辑脚本

bash
vi start.sh

按i或insert键进入编辑模式

输入下方示例的中的脚本代码

按esc,输入:wq保存

给予可执行权限

使用 sudo chmod +x start.sh 给脚本添加可执行权限(root用户可不加sudo,直接使用chmod)

脚本示例

bash
#!/bin/bash
#作者404E
echo '------------------------------------------------------------------'
echo '-                                                                -'
echo '-                         开始启动服务端                         -'
echo '-                                                                -'
echo '------------------------------------------------------------------'
while true;
do
    java -Xms2G -Xmx2G -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true -jar server.jar nogui
    echo '------------------------------------------------------------------'
    echo '-                                                                -'
    echo '-                       服务器将在3秒后重启                      -'
    echo '-                     按 ctrl + c 停止服务端                     -'
    echo '-                                                                -'
    echo '------------------------------------------------------------------'
    for i in $(seq 3 -1 1)
    do
        echo -n "·"
        sleep 1s
    done
    echo ''
    echo '------------------------------------------------------------------'
    echo '-                                                                -'
    echo '-                         开始重启服务端                         -'
    echo '-                                                                -'
    echo '------------------------------------------------------------------'
done

以上是我用的脚本,优化参数 https://aikar.co/2018/07/02/tuning-the-jvm-g1gc-garbage-collector-flags-for-minecraft/

重启时自动备份的脚本

bash
#!/bin/bash
#作者404E
echo '------------------------------------------------------------------'
echo '-                                                                -'
echo '-                         开始启动服务端                         -'
echo '-                                                                -'
echo '------------------------------------------------------------------'
while true;
do
    java -Xms2G -Xmx2G -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true -jar server.jar nogui
    # 备份
    echo '------------------------------------------------------------------'
    echo '-                                                                -'
    echo '-                     服务器将在3秒后开始备份                    -'
    echo '-                     按 ctrl + c 停止服务端                     -'
    echo '-                                                                -'
    echo '------------------------------------------------------------------'
    for i in $(seq 3 -1 1)
    do
    echo -n "·"
    sleep 1s
    done
    # 备份保留个数
    c=5
    if [ ! -d "backup" ];then
    mkdir backup
    fi
    rm -rf backup/$c.tar.gz
    for((i=$c;i>0;i--));
    do if [ -f "backup/"$i".tar.gz" ];then
    mv backup/$i.tar.gz backup/`expr $i + 1`.tar.gz
    fi done
    # 创建备份指令,可自行添加文件夹(将#去掉)
    tar -zcf backup/1.tar.gz world #world_nether world_the_end
    # 备份结束
    echo '------------------------------------------------------------------'
    echo '-                                                                -'
    echo '-                  备份完成  服务器将在3秒后重启                 -'
    echo '-                     按 ctrl + c 停止服务端                     -'
    echo '-                                                                -'
    echo '------------------------------------------------------------------'
    for i in $(seq 3 -1 1)
    do
        echo -n "·"
        sleep 1s
    done
    echo ''
    echo '------------------------------------------------------------------'
    echo '-                                                                -'
    echo '-                         开始重启服务端                         -'
    echo '-                                                                -'
    echo '------------------------------------------------------------------'
done