
隔了这么久没发视频,好不容易来了一个竟然还是个技术向专栏),心情很微妙,不多说了。
自动重启我自己也摸索了好久,终于搞定了,教程发出来造福一下人类)。跟着教程做一定能成功的,不要做到一半不耐烦跑了哦~
教程环境:Linux操作系统,Spigot系我的世界服务端,一个FTP客户端(我用的Xftp)
(因环境不同产生的问题最好别问我 我估计也不知道)

想要达到完美的自动重启,我们需要配合服务器插件。这里推荐 UltimateAutoRestart 插件,功能完善,显示美观,轻量,也有汉化,MCBBS/Spigot上都能找到,如何安装不多赘述了。
插件会在你设置时间帮我们执行 /save-all 指令和 /restart 指令。
/save-all用作保存玩家数据防止回档,/restart则用来关闭服务器,接着尝试运行启动脚本。也就是说,/restart 指令正常情况下只能帮我们关闭服务器,却无法再打开它。那么我们该如何做到再次自动打开服务器呢?我们需要在启动脚本上下功夫。

首先,我们需要创建一个启动脚本。打开你服务端中的spigot.yml文件,找到
restart-script: ./start.sh
这一项设置。它代表你的启动脚本应该在游戏一级目录(跟spigot.yml之类的文件在一个位置),而且名叫 start.sh (其实就是个Shell脚本) 。那么就按照它说的,在服务端一级目录下新建一个 start.sh 文件。

就是它
接着把启动脚本抄进去:
#!/bin/sh
while true
do
a=$(cat control)
if [ $a -eq 1 ]
then
sleep 30s
java -server -XincGC -Xmx8G -Xms8G -XX:+AggressiveOpts -XX:+UseCompressedOops -XX:+UseCMSCompactAtFullCollection -XX:+UseFastAccessorMethods -XX:ParallelGCThreads=2 -XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=2 -XX:CMSInitiatingOccupancyFraction=70 -XX:-DisableExplicitGC -XX:TargetSurvivorRatio=90 -jar paper-1.16.5-642.jar
#上面一大坨是我用的启动命令,请换成你自己的,否则无法使用
else
echo "已停止自动重启"
exit
fi
done
把上面的内容复制进start.sh保存后,在服务器后台执行 ed -i 's/\r$//' start.sh 命令。
解释一下:当脚本被运行时,检测一个叫 control 的文件中的内容,如果内容是 1 ,则执行启动命令,否则输出 已停止自动重启 并结束执行脚本。比起传统的无脑无限循环执行脚本,这种脚本更加可控。毕竟用那种脚本的话,有什么特殊情况要紧急关闭服务器时就会发现根本关不掉(老麻烦了),到时候哭都来不及。
所以我们要新建一个 control 文件:

一 图 两 用
然后在里面写上 1 ,这样就能启动了。想关闭自动重启的话删掉 1 就好。
我的脚本中还出现了 sleep 30s 这一条代码,它代表执行启动命令前要延迟三十秒。因为但凡有十几个插件的服务器,关闭时总会消耗一些时间。假如不延迟直接执行启动命令,就有可能和关闭进程冲突,造成无限报错。30s是比较长的延时了,你可以自行调低一些。
为什么还要执行一下 ed -i 's/\r$//' start.sh 命令呢?因为Windows下的换行和Linux下的换行有所不同,不执行这条命令删除多出的换行字符的话会报错,不多赘述。

脚本写完了,学学怎么用。
首先,进Screen。后台输入 screen -S [随便一个名字] (已经在里面的就不用管了)
然后,输入 ./start.sh 运行刚刚写的脚本。假如一切正常,那么经过一段延时后,你的服务器应该已经开始启动了。

(暴露CPU了)
启动完之后,试试文章开头说的 UltimateAutoRestart 插件。输入 ar now 10 ,表示执行强制自动重启,延迟十秒。十秒后,你的服务器应该开始关闭了。关闭完成后会有一段延时,接着,你的服务器应该又自己打开了。

Matrix 余裕です
还可以试试是否可以正常停止自动重启。流程一样,只是打开服务器后先把control文件里的1删掉,再执行 ar now 10 ,看看关闭后会不会有 已停止自动重启 字样。

就这样
一切都没有问题的话,恭喜你,你很快地整好了我整了八个小时的自动重启),现在你的服务器又安全了一点。

芜湖,写完了。第一次写这种技术类的专栏,略墨迹多多包涵,有啥问题评论区请。
那么我们下次再见啦,掰掰