用脚本实现Minecraft服务器崩溃自动重启和定时开关,并自动整理日志(自用备忘)

背景:由于租用的云服务器性能有限,多人联机时Minecraft服务器经常崩溃,手动重新启动也比较麻烦,于是照着网上的脚本改了一下,实现Minecraft服务器崩溃时自动重启。


自用脚本如下

  1. start_mc_server.bash
#!/bin/bash
screen -dmS "mc_server" bash ./screen_mc_server.bash
  1. 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
  1. stop_mc_server.bash
#!/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中,每天服务器关闭后执行,可以保存前一天的日志。


主要参考:

常用页面备忘:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值