云计算百科
云计算领域专业知识百科平台

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

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


自用脚本如下

  • start_mc_server.bash
  • #!/bin/bash
    screen -dmS "mc_server" bash ./screen_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

  • 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中,每天服务器关闭后执行,可以保存前一天的日志。


    主要参考:

    • 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命令搜索
    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 用脚本实现Minecraft服务器崩溃自动重启和定时开关,并自动整理日志(自用备忘)
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!