背景:由于租用的云服务器性能有限,多人联机时Minecraft服务器经常崩溃,手动重新启动也比较麻烦,于是照着网上的脚本改了一下,实现Minecraft服务器崩溃时自动重启。
自用脚本如下
#!/bin/bash
screen -dmS "mc_server" bash ./screen_mc_server.bash
#!/bin/bash
# 进入服务器目录
cd minecraft
while [ true ]; do
# 检查日志目录和文件
if [[ ! -d "logs/mylog" ]]; then
mkdir "logs/mylog";
fi
if [[ ! -f "logs/mylog/running_status.log" ]]; then
touch "logs/mylog/running_status.log";
fi
echo "[$(date +"%Y.%m.%d %T")] Starting" >> logs/mylog/running_status.log
# 启动服务器指令
java -Xmx1024M -jar fabric-server-mc.1.21.1-loader.0.16.5-launcher.1.0.1.jar nogui
# 获取退出状态
exit_code=$?
if [ $exit_code == 0 ]; then
echo "[$(date +"%Y.%m.%d %T")] Stopped" >> logs/mylog/running_status.log
break;
elif [ $exit_code == 1 ]; then
echo "[$(date +"%Y.%m.%d %T")] Stopped and restarting" >> logs/mylog/running_status.log
fi
sleep 10
done
#!/bin/bash
SES="mc_server" # 窗口名
if screen -list | grep -q "$SES"; then
echo "发现服务器窗口"
# 检查服务器进程是否存在
if pgrep -f "java" > /dev/null; then
echo "服务器进程存在"
# 输入关服命令
screen -S $SES -p 0 -X stuff "stop^M"
# 循环等待至服务器进程关闭
while pgrep -f "java" > /dev/null; do
sleep 2
done
echo "服务器进程已关闭"
fi
fi
用法:执行start_mc_server.bash即可启动Minecraft服务器,执行stop_mc_server.bash或在游戏中使用stop指令可停止服务器。当服务器异常退出时,会自动重启Minecraft服务器。 定时开关使用crontab -e设置定时执行脚本,根据自己脚本的路径修改。我设置的是每天13:00-23:30运行。
脚本使用了一段时间,暂未发现问题。观察log文件,发现自动重启也能够正常运行。
更新@2024.10.05: 用脚本实现Minecraft服务器日志文件自动合并 Minecraft服务器运行会记录每次运行的日志,日志内容大概如图格式 每次产生新的日志时,旧的日志会被压缩为名字形如2024-09-17-1.log.gz的文件,同一天不同的日志会被保存为不同的文件,如2024-09-17-2.log.gz。压缩后的文件不方便直接查看,且由于MC服务器重启,同一天可能产生多个日志文件,不方便整理。 于是有了下面这个脚本,功能是自动解压日志,保存同一天的日志为一个文件,并且删除模组启动的信息(上图Loading 43 Mods:及其后之后若干行,即以-或|–或\\–开头的内容)、删除不重要的信息(含有[main/INFO]的内容)
#!/bin/bash
# 设置日志目录
LOG_DIR="/root/minecraft/logs"
# 进入输出路径
cd /home/kodbox/mc_logs
# 遍历所有 .log.gz 文件
for log_file in "$LOG_DIR"/*.log.gz; do
if [[ -f "$log_file" ]]; then
# 提取日期部分
DATE=$(basename "$log_file" | cut -d'-' -f1-3)
OUTPUT_FILE="${DATE}_logs.log" # 根据日期命名输出文件
# 解压并过滤内容,追加到对应的日期文件
gunzip -c "$log_file" | \\
grep -v '\\[main/INFO\\]' | \\
sed '/^[[:space:]]*\\(|–\\|\\\\–\\|-\\)/d' >> "$OUTPUT_FILE"
chmod 777 $OUTPUT_FILE # 修改日志文件的权限
fi
done
# 移动已经复制的日志到备份文件夹
mv $LOG_DIR/*.log.gz $LOG_DIR/backup/
这里还额外添加了修改文件权限的指令,将日志存放在可道云路径,便于通过浏览器查看。最后将执行脚本写在crontab中,每天服务器关闭后执行,可以保存前一天的日志。
主要参考:
- How do I automatically restart a Minecraft Spigot server in the event of a crash or /stop when using screen? – stackoverflow
- 定时启停MC游戏服务器 – CSDN博客
常用页面备忘:
- server.properties – Minecraft Wiki
- Linux命令搜索
评论前必须登录!
注册