You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何优化我的MC服务器自动重启Bash脚本?

嘿,作为刚上手Bash的新手,你的思路已经相当靠谱了——自动监测MC服务器状态、崩溃后重启还加了日志记录,这已经迈出了很棒的一步!不过咱们可以优化几个细节,让脚本更可靠、健壮,也更符合Bash的最佳实践:

一、先说说原脚本里的小问题
  1. 进程检测容易误判
    原脚本用ps auxw | grep start.sh | grep -v grep来判断服务器是否运行,这会有个隐患:如果系统里还有其他同名的start.sh脚本在跑,会误判成MC服务器还在运行,导致该重启的时候没重启。

  2. 日志重定向有错误
    原脚本里echo "Server restarted on: $(date)" >> /home/minecraft/minecraft/RestartLog.txt > /dev/null这行,后面的> /dev/null会覆盖前面的追加日志操作,导致重启记录根本写不进日志文件,得删掉这个多余的重定向。

  3. 健壮性不足
    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
三、额外的实用建议
  1. 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 &让它后台运行即可。

  1. 推荐用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

火山引擎 最新活动