告别手动重启:用Shell和Batch脚本打造你的Minecraft服务器7x24小时无人值守守护进程

张开发
2026/4/21 17:07:47 15 分钟阅读

分享文章

告别手动重启:用Shell和Batch脚本打造你的Minecraft服务器7x24小时无人值守守护进程
构建Minecraft服务器无人值守守护进程Shell与Batch脚本的进阶实践凌晨三点服务器又崩溃了——这已经是本周第三次被玩家的电话叫醒。作为服主你是否也经历过这种噩梦本文将带你超越基础启动脚本打造真正可靠的7x24小时无人值守解决方案。不同于网上随处可见的简单循环脚本我们将从运维工程角度构建具备崩溃恢复、会话管理、日志记录等企业级特性的守护系统。1. 守护进程设计理念与基础架构在Linux系统中守护进程daemon是指在后台长期运行的特殊进程。Windows服务也有类似概念。我们需要让Minecraft服务器具备以下守护特性后台运行不依赖SSH会话维持自动恢复崩溃后立即重启状态监控检测假死并处理日志管理记录所有控制台输出资源隔离避免影响主机稳定性1.1 核心组件对比功能需求Linux解决方案Windows解决方案后台运行screen/tmux计划任务/服务注册崩溃检测进程退出码检查ERRORLEVEL检测日志记录tee或重定向到文件重定向到文本文件资源监控shell脚本cronPowerShell脚本提示无论选择哪种方案都应确保脚本具有适当的执行权限并测试在系统重启后能否自动恢复服务。2. Linux环境下的高级守护实现2.1 使用tmux进行会话管理tmux比screen更适合生产环境它支持会话持久化即使断开SSH连接多窗口管理脚本化创建会话#!/bin/bash # minecraft_daemon.sh TMUX_SESSIONmc_server JAR_FILEforge-1.12.2-14.23.5.2854.jar LOG_FILE/var/log/mc_server.log while true; do # 检查tmux会话是否存在 if ! tmux has-session -t $TMUX_SESSION 2/dev/null; then tmux new-session -d -s $TMUX_SESSION fi # 在tmux会话中启动服务器 tmux send-keys -t $TMUX_SESSION java -server -Xmx4096M -Xms1024M -jar $JAR_FILE nogui 21 | tee -a $LOG_FILE C-m # 等待进程结束 while tmux has-session -t $TMUX_SESSION; do sleep 10 done # 记录崩溃时间 echo [$(date)] Server crashed, restarting... $LOG_FILE sleep 5 done2.2 系统服务化部署更专业的做法是将脚本注册为systemd服务# /etc/systemd/system/mcserver.service [Unit] DescriptionMinecraft Server Afternetwork.target [Service] Usermcuser WorkingDirectory/opt/minecraft ExecStart/opt/minecraft/minecraft_daemon.sh Restartalways KillModeprocess [Install] WantedBymulti-user.target启用服务sudo systemctl daemon-reload sudo systemctl enable mcserver sudo systemctl start mcserver3. Windows环境下的健壮性方案3.1 批处理脚本增强版echo off :: mc_server_daemon.bat set SERVER_JARforge-1.12.2-14.23.5.2854.jar set LOG_FILEmc_server.log set MIN_MEM1024M set MAX_MEM4096M :restart echo [%date% %time%] Starting server... %LOG_FILE% java -server -Xms%MIN_MEM% -Xmx%MAX_MEM% -jar %SERVER_JAR% nogui %LOG_FILE% 21 if %ERRORLEVEL% neq 0 ( echo [%date% %time%] Server crashed with exit code %ERRORLEVEL% %LOG_FILE% timeout /t 10 /nobreak nul ) goto restart3.2 注册为Windows服务使用NSSM工具将批处理脚本转为系统服务nssm install MinecraftServer C:\path\to\mc_server_daemon.bat nssm set MinecraftServer AppDirectory C:\path\to\server nssm set MinecraftServer DisplayName Minecraft Server nssm set MinecraftServer Start SERVICE_AUTO_START net start MinecraftServer4. 高级监控与自动化4.1 假死检测机制服务器可能无响应但进程仍在运行。添加心跳检测# Linux假死检测脚本 #!/bin/bash MAX_HANG_SECONDS300 RESTART_COMMANDtmux send-keys -t mc_server C-c while true; do LAST_ACTIVITY$(grep -i joined the game /var/log/mc_server.log | tail -1 | cut -d -f1-2) CURRENT_TIME$(date %Y-%m-%d %H:%M:%S) if [ -n $LAST_ACTIVITY ]; then SECONDS_DIFF$(( $(date -d $CURRENT_TIME %s) - $(date -d $LAST_ACTIVITY %s) )) if [ $SECONDS_DIFF -gt $MAX_HANG_SECONDS ]; then echo [$CURRENT_TIME] Server appears hung, restarting... /var/log/mc_server.log eval $RESTART_COMMAND fi fi sleep 60 done4.2 自动化备份集成在重启循环中添加备份逻辑:: Windows备份片段 set BACKUP_DIRC:\mc_backups set SAVE_DIRC:\server\world set MAX_BACKUPS7 :restart robocopy %SAVE_DIR% %BACKUP_DIR%\%date:/-%_%time::-% /MIR /Z for /f skip%MAX_BACKUPS% delims %%d in (dir %BACKUP_DIR% /ad /b /o-d) do rd /s /q %BACKUP_DIR%\%%d java -server -Xms1024M -Xmx4096M -jar forge-1.12.2-14.23.5.2854.jar nogui mc_server.log 21 goto restart5. 性能调优与问题排查5.1 JVM参数优化建议针对Minecraft服务器的推荐配置-XX:UseG1GC -XX:ParallelRefProcEnabled -XX:MaxGCPauseMillis200 -XX:UnlockExperimentalVMOptions -XX:DisableExplicitGC -XX:AlwaysPreTouch -XX:G1NewSizePercent30 -XX:G1MaxNewSizePercent40 -XX:G1HeapRegionSize8M -XX:G1ReservePercent20 -XX:G1HeapWastePercent5 -XX:G1MixedGCCountTarget4 -XX:InitiatingHeapOccupancyPercent15 -XX:G1MixedGCLiveThresholdPercent90 -XX:G1RSetUpdatingPauseTimePercent5 -XX:SurvivorRatio32 -XX:PerfDisableSharedMem -XX:MaxTenuringThreshold15.2 常见问题诊断表症状可能原因解决方案启动后立即崩溃内存不足/JAR损坏检查Xmx值/重新下载服务端玩家频繁断开连接网络延迟/Tick延迟优化实体数量/检查网络带宽服务器逐渐变卡内存泄漏/区块加载过多定期重启/预生成地图控制台无响应线程死锁启用看门狗脚本备份失败磁盘空间不足清理旧备份/增加存储在实际运营中我们发现最有效的稳定性保障来自三个方面合理的JVM参数、定期的维护重启尽管有守护脚本以及严格的插件管理。一个配置不当的插件可能毁掉最完善的守护系统。

更多文章