返回

Minecraft 服务器重启后自动启动失败?四种方案解决

Linux

Minecraft 服务器重启后未通过 Screen 和 Crontab 自动启动

问题分析

使用 Screencrontab 在系统重启后自动启动 Minecraft 服务器是很常见的做法,但有时会遇到服务器未能正常启动的情况。一种典型情景是,当从命令行直接运行启动脚本时,服务器可以正常运行;但当使用 crontab 安排在系统重启后启动时,服务器却未能按预期启动。这是由于 crontab 的环境和运行方式与直接在终端运行脚本有所不同导致的。主要问题出在以下几点:

  1. 环境变量: crontab 运行脚本时所使用的环境变量可能与当前用户环境不同。脚本中的路径,尤其是相对路径,在 crontab 环境下可能会失效,找不到 server.jar,进而导致服务器启动失败。
  2. 工作目录: crontab 运行的脚本的默认工作目录通常是 / (根目录)。这跟用户在自己 home 目录执行脚本的默认目录大相径庭,因此脚本如果包含相对路径的操作会执行失败。
  3. 权限问题: 在某些情况下,crontab 所用的用户可能没有执行特定命令的权限,例如操作 screen

解决方案

针对以上问题,可以采用如下方法进行修复。

方法一:使用绝对路径

将脚本中所有相对路径替换为绝对路径,保证 crontab 在任何工作目录下都能正确找到所需的资源。 这尤其适用于 server.jar 的路径。

  1. 修改 start.sh 脚本:

    #!/bin/sh
    echo "starting..." > /home/<user>/mcserver/started.txt
    screen -dmS Server java -Xms2G -Xmx7G -jar /home/<user>/mcserver/server.jar nogui
    

    操作步骤:

    将脚本中的 /home/<user>/mcserver/ 替换为你实际的 Minecraft 服务器目录的绝对路径,用户<user> 要替换成服务器账号的实际用户名。 记得修改XmsXmx以符合服务器的实际要求,这部分需要提前计算并修改好。确保路径精确无误,避免任何的笔误或者拼写错误。

  2. 修改 crontab 文件:

    在终端输入 crontab -e 编辑 crontab 文件,内容替换成:

    0 1 * * * reboot
    @reboot sleep 60 && /home/<user>/mcserver/start.sh
    

    操作步骤:

    在上面的 @reboot 指令前加入了 sleep 60 && 这段代码, 它的含义是让机器重启以后等待 60 秒,之后执行 start.sh,可以减少因为机器正在初始化还没有完全进入可以启动状态就执行脚本导致服务器启动失败的情况。<user> 同步修改成你的服务器用户账号名称。

方法二:切换到工作目录

在脚本开头增加 cd 命令,先将工作目录切换到 Minecraft 服务器所在的目录,然后再执行相关操作,这可以处理相对路径失效问题。

  1. 修改 start.sh 脚本:

    #!/bin/sh
    cd /home/<user>/mcserver
    echo "starting..." > started.txt
    screen -dmS Server java -Xms2G -Xmx7G -jar server.jar nogui
    

    操作步骤:

    使用cd /home/<user>/mcserver 将工作目录切换到 Minecraft 服务器所在位置,这样之后脚本中的任何相对路径(比如server.jar)就都正确了。XmsXmx内存配置按照自己的情况配置。

  2. crontab文件维持不变:

    crontab 部分沿用上一个方法,不需要额外调整, sleep 60 让启动延迟的这个设置对大多数服务器是有益的。

方法三:显式设置 PATH 变量

有些情况下,crontabPATH 变量可能未包含 Java 可执行文件的路径,导致 java 命令无法找到。 可以在 start.sh 脚本中手动指定 Java 可执行文件的绝对路径。

  1. 修改 start.sh 脚本:

    #!/bin/sh
    PATH=$PATH:/usr/bin:/usr/local/bin #根据实际 Java 路径调整,如果默认安装路径无需配置。
    echo "starting..." > /home/<user>/mcserver/started.txt
    screen -dmS Server /usr/bin/java -Xms2G -Xmx7G -jar /home/<user>/mcserver/server.jar nogui # 修改为Java绝对路径
    

    操作步骤:

    PATH 定义是当前用户的环境变量配置,其中存储着系统寻找命令路径的信息。 手动设置 PATH=$PATH:/usr/bin:/usr/local/bin 可以确保系统可以在指定位置找到 java 的可执行文件。需要根据你的 Java 的安装位置调整 PATHjava 的绝对路径。大多数情况下 java 都会安装在上述路径里。 类似 /usr/lib/jvm/<java-version>/bin/java 路径也是可能的。确认java的具体路径可以使用 which java 命令查看,注意在有多个java环境的情况, which java 返回的路径可能是符号链接而不是绝对路径。请确保替换 Xms Xmx 并匹配实际机器配置,并修改 Minecraft server 安装路径。

  2. crontab文件维持不变:

    crontab 文件不需要做任何改动,维持前面方法中的内容。

方法四:使用 sudoers

在某些严格的环境下,crontab 可能需要以 root 身份运行某些 screen 或者 java 等命令。 需要仔细考量这样做带来的风险,并避免将所有的程序都添加到 sudoers,而是只增加必要项,使用 sudo 命令来提权执行某些特定操作。需要增加对 sudoers 的配置以避免 sudo 需要输入密码的问题。

  1. 编辑 sudoers 文件:

    运行 sudo visudo 编辑 /etc/sudoers 文件, 添加如下一行:

    <user>  ALL=(ALL)   NOPASSWD: /usr/bin/screen
    

    这里的 <user> 是你用来启动 minecraft 的账户用户名。 这意味着用户可以不需要密码就可以执行 sudo /usr/bin/screen 这个指令。 这样做潜在的安全隐患需要注意,必须谨慎使用,确认授权范围合理有效,并且用户拥有足够安全知识。

  2. 修改 start.sh 脚本:

     #!/bin/sh
    echo "starting..." > /home/<user>/mcserver/started.txt
    sudo /usr/bin/screen -dmS Server /usr/bin/java -Xms2G -Xmx7G -jar /home/<user>/mcserver/server.jar nogui # 修改为Screen绝对路径
    

    操作步骤:

    增加了 sudo /usr/bin/screen 以确保 screen 可以在 crontab 中运行。 修改Xms Xmx 以适应服务器性能,并更改 Minecraft server 安装路径。 使用了 which screenwhich java 查询命令来确保 screenjava的路径都是准确的。

  3. crontab 文件需要适当调整
    crontab 保持跟前面一样,在需要的情况下,调整 sleep 时间。

```
0 1 * * * reboot
@reboot sleep 60 && /home/<user>/mcserver/start.sh
```

额外安全建议

  • 尽量不要使用 root 用户直接启动 Minecraft 服务器。创建一个单独的用户,并且使用 sudo 来赋予必要权限。
  • 使用 ufwiptables 等防火墙软件来保护你的服务器,并限制仅允许的端口的连接。
  • 定期备份 Minecraft 服务器的数据,以防止数据丢失。
  • 定期检查并更新操作系统,Java 环境,以及 Minecraft 服务器的版本,以避免安全漏洞。

每个方法都需要根据自身环境做相应的调整,切勿生搬硬套, 需要仔细测试每个方案的最终运行效果。