如何优化我的MC服务器自动重启Bash脚本?
嘿,作为刚上手Bash的新手,你的思路已经相当靠谱了——自动监测MC服务器状态、崩溃后重启还加了日志记录,这已经迈出了很棒的一步!不过咱们可以优化几个细节,让脚本更可靠、健壮,也更符合Bash的最佳实践:
一、先说说原脚本里的小问题
进程检测容易误判
原脚本用ps auxw | grep start.sh | grep -v grep来判断服务器是否运行,这会有个隐患:如果系统里还有其他同名的start.sh脚本在跑,会误判成MC服务器还在运行,导致该重启的时候没重启。日志重定向有错误
原脚本里echo "Server restarted on: $(date)" >> /home/minecraft/minecraft/RestartLog.txt > /dev/null这行,后面的> /dev/null会覆盖前面的追加日志操作,导致重启记录根本写不进日志文件,得删掉这个多余的重定向。健壮性不足
crontab的运行环境和你平时登录的Shell环境不一样,直接用相对路径可能会出问题;另外也没做目录、进程的容错检查。
二、优化后的脚本示例
下面是调整后的版本,解决了上面的问题,还加了更实用的细节:
#!/bin/bash # 配置参数,把路径和关键信息统一放这里,方便修改 SERVER_DIR="/home/minecraft/minecraft" RESTART_LOG="$SERVER_DIR/RestartLog.txt" # 改成你的MC服务器进程的识别关键字(比如server.jar,因为MC是Java程序) PROCESS_KEYWORD="server.jar" # 先检查服务器目录是否存在,避免报错 if [ ! -d "$SERVER_DIR" ]; then echo "$(date '+%Y-%m-%d %H:%M:%S') - 错误:服务器目录 $SERVER_DIR 不存在!" >> "$RESTART_LOG" exit 1 fi # 用pgrep精准检测MC进程,比ps grep更可靠 pgrep -f "$PROCESS_KEYWORD" > /dev/null if [ $? -ne 0 ]; then # 进入服务器目录(用|| exit 1确保目录切换失败时直接退出) cd "$SERVER_DIR" || exit 1 # 后台启动服务器,同时把启动输出重定向,避免干扰 ./start.sh > /dev/null 2>&1 & # 写入更详细的重启日志 echo "$(date '+%Y-%m-%d %H:%M:%S') - MC服务器未运行,已自动重启" >> "$RESTART_LOG" fi
三、额外的实用建议
- crontab频率不用太高
每分钟运行一次完全足够,MC服务器崩溃后一分钟重启对玩家来说几乎感知不到,也不会给CPU造成压力。如果真的要更频繁(比如每10秒),可以写个后台循环脚本,而不是用crontab:
#!/bin/bash while true; do # 把上面的检测逻辑放这里 pgrep -f "server.jar" > /dev/null if [ $? -ne 0 ]; then cd /home/minecraft/minecraft/ && ./start.sh > /dev/null 2>&1 & echo "$(date '+%Y-%m-%d %H:%M:%S') - MC服务器已重启" >> RestartLog.txt fi sleep 10 done
然后用nohup ./monitor.sh &让它后台运行即可。
- 推荐用systemd管理(更专业)
其实现在Linux服务器更推荐用systemd来管理MC进程,自带自动重启、日志管理功能,比自己写脚本省心太多:
创建/etc/systemd/system/minecraft.service文件:
[Unit] Description=Minecraft服务器 After=network.target [Service] User=minecraft WorkingDirectory=/home/minecraft/minecraft # 改成你的MC启动命令,比如java -Xmx2G -Xms2G -jar server.jar nogui ExecStart=/usr/bin/java -Xmx2G -Xms2G -jar server.jar nogui Restart=always RestartSec=5 # 崩溃后5秒自动重启 [Install] WantedBy=multi-user.target
然后执行以下命令启用服务:
sudo systemctl daemon-reload sudo systemctl enable --now minecraft
之后服务器会自动维护,日志可以用journalctl -u minecraft -f实时查看,非常方便。
内容的提问来源于stack exchange,提问作者Doctor Who




