自从刷线机/刷铁机等利用Minecraft的bug特性制造的便利机械发明以来,很多玩家都收益于这种机械与村民交易等游戏机制来扩充自己的Minecraft游戏体验。我也不例外,在最近跟朋友们开的私服玩的时候搞了个刷线机来进行一个村民交易的榨干

然而某一天在大家一起肝完某个模组成就后,不知道谁开了刷线机忘记关闭就退出服务器了,直到第二天晚上大家才发现服务器进不去了…而且最要命的是服务器忘记备份了…

故障排查

发现进不去后,第一件事就是重启服务端。但是我们惊奇地发现重启服务端会一直卡在某模组加载完毕的提示,等了一个多小时也不显示经典的”Done! Elapsed time:xxx”开服完成提示。我们尝试还原备份才发现开服到现在一直没有备份过。于是乎只能开始排查故障,尝试救回来。

在经过了一系列”质问”之后,我们猜到了可能是刷线机没有关闭导致的地上物品太多卡死崩溃。

第一次抢救

既然服务器卡死加载不完,那本地可不可以呢?带着这样的想法,我们尝试将地图文件夹下载下来本地加载,但跟预想的一样,也是加载到本地游戏未响应很久也进不去,这个方法没效。

第二次抢救

加载不完的话,分配多点内存能不能行呢?我们尝试给服务端分配了16个G的内存,但仍然还是卡在了那个位置。看来问题比我们想象的还严重(毕竟刷线机一直开了一整天)。

柳暗花明又一村

就在我们准备放弃了时候,我们注意到了server.properties中的一个不起眼的设置项:max-world-size。字面意思,这个设置项控制的是世界生成的大小。我们的刷线机就在世界出生点附近,那么如果我们把这个设置项调到刚好包括刷线机的话,是否能开服成功进去清掉地上的物品呢?

直接说结果:一旦包括到刷线机的范围,就开不动服务器了;但是只要没包括到,服务器是可以成功运行的!

于是,我们开了一个很小的范围,大概也就20*20左右的大小,服务器终于出现了”Done!”的提示。

新的问题

但是在开完服后,我们在服务端console输入”kill @e[type=Item]”指令后得到的输出却出乎我们的意料:”已清除 4 个实体”。只有四个?怎么可能呢?于是我尝试进入游戏,结果发现两件事:

  1. 1.因为玩家的位置并不在max-world-size内,进去后没多久玩家会直接死亡,提示信息是被挤死了
  2. 2.进去后不用一会游戏和服务端都会一起卡死崩溃

看来是世界生成大小外的地上掉落物在附近有玩家时才会加载。那么我们应该怎么解决呢?

问题解决

最后的解决方法是这样的:一个人在服务端做着准备,随时准备疯狂按方向键上+回车输入”kill @e[type=Item]”指令来清除地上物品;另一个人准备好两条指令:

/gamemode spectator

/gamerule doTileDrops false

进服务器迅速执行以上两个指令。第一个指令将自己改为观察者模式,防止被夹死影响指令输入;第二个指令则是通过修改游戏规则,让刷线机不再产出新的线。在完成以上操作后,我们在服务端console看到了一个非常离谱的输出:”已清除 776432 个实体”!这说明地上有七十多万个(或者说七十多万组,因为这个指令输出好像是一格一起丢出来只算一个)线…太恐怖了吧…

在进行完以上操作后,正常关闭保存服务器,把max-world-size改回默认,再重开服务器关闭刷线机并输入以下命令将物品掉落改回开启就好了。

/gamerule doTileDrops true

最后,跟罪魁祸首刷线机(我脚下这个)合个影吧23333333