用脚本实现Minecraft服务器瓦解自动重启和定时开关,并自动整理日志(自用 ...

东湖之滨  论坛元老 | 2025-2-13 11:35:34 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1024|帖子 1024|积分 3076

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

自用脚本如下

  • start_mc_server.bash
  1. #!/bin/bash
  2. screen -dmS "mc_server" bash ./screen_mc_server.bash
复制代码

  • screen_mc_server.bash
  1. #!/bin/bash
  2. # 进入服务器目录
  3. cd minecraft
  4. while [ true ]; do
  5.     # 检查日志目录和文件
  6.     if [[ ! -d "logs/mylog" ]]; then
  7.         mkdir "logs/mylog";
  8.     fi
  9.     if [[ ! -f "logs/mylog/running_status.log" ]]; then
  10.         touch "logs/mylog/running_status.log";
  11.     fi
  12.     echo "[$(date +"%Y.%m.%d %T")] Starting" >> logs/mylog/running_status.log
  13.     # 启动服务器指令
  14.     java -Xmx1024M -jar fabric-server-mc.1.21.1-loader.0.16.5-launcher.1.0.1.jar nogui
  15.     # 获取退出状态
  16.     exit_code=$?
  17.     if [ $exit_code == 0 ]; then
  18.         echo "[$(date +"%Y.%m.%d %T")] Stopped" >> logs/mylog/running_status.log
  19.         break;
  20.     elif [ $exit_code == 1 ]; then
  21.         echo "[$(date +"%Y.%m.%d %T")] Stopped and restarting" >> logs/mylog/running_status.log
  22.     fi
  23.     sleep 10
  24. done
复制代码

  • stop_mc_server.bash
  1. #!/bin/bash
  2. SES="mc_server" # 窗口名
  3. if screen -list | grep -q "$SES"; then
  4.     echo "发现服务器窗口"
  5.     # 检查服务器进程是否存在
  6.     if pgrep -f "java" > /dev/null; then
  7.         echo "服务器进程存在"
  8.         # 输入关服命令
  9.         screen -S $SES -p 0 -X stuff "stop^M"
  10.             # 循环等待至服务器进程关闭
  11.             while pgrep -f "java" > /dev/null; do
  12.             sleep 2
  13.             done
  14.         echo "服务器进程已关闭"
  15.     fi
  16. 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]的内容)
  1. #!/bin/bash
  2. # 设置日志目录
  3. LOG_DIR="/root/minecraft/logs"
  4. # 进入输出路径
  5. cd /home/kodbox/mc_logs
  6. # 遍历所有 .log.gz 文件
  7. for log_file in "$LOG_DIR"/*.log.gz; do
  8.     if [[ -f "$log_file" ]]; then
  9.         # 提取日期部分
  10.         DATE=$(basename "$log_file" | cut -d'-' -f1-3)
  11.         OUTPUT_FILE="${DATE}_logs.log"  # 根据日期命名输出文件
  12.         # 解压并过滤内容,追加到对应的日期文件
  13.         gunzip -c "$log_file" | \
  14.         grep -v '\[main/INFO\]' | \
  15.         sed '/^[[:space:]]*\(|--\|\\--\|-\)/d' >> "$OUTPUT_FILE"
  16.         chmod 777 $OUTPUT_FILE # 修改日志文件的权限
  17.     fi
  18. done
  19. # 移动已经复制的日志到备份文件夹
  20. 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下令搜索

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

东湖之滨

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表