Minecraft 服务器重启后自动启动失败?四种方案解决
2025-01-19 17:03:10
Minecraft 服务器重启后未通过 Screen 和 Crontab 自动启动
问题分析
使用 Screen
和 crontab
在系统重启后自动启动 Minecraft 服务器是很常见的做法,但有时会遇到服务器未能正常启动的情况。一种典型情景是,当从命令行直接运行启动脚本时,服务器可以正常运行;但当使用 crontab
安排在系统重启后启动时,服务器却未能按预期启动。这是由于 crontab
的环境和运行方式与直接在终端运行脚本有所不同导致的。主要问题出在以下几点:
- 环境变量:
crontab
运行脚本时所使用的环境变量可能与当前用户环境不同。脚本中的路径,尤其是相对路径,在crontab
环境下可能会失效,找不到server.jar
,进而导致服务器启动失败。 - 工作目录:
crontab
运行的脚本的默认工作目录通常是/
(根目录)。这跟用户在自己 home 目录执行脚本的默认目录大相径庭,因此脚本如果包含相对路径的操作会执行失败。 - 权限问题: 在某些情况下,
crontab
所用的用户可能没有执行特定命令的权限,例如操作screen
。
解决方案
针对以上问题,可以采用如下方法进行修复。
方法一:使用绝对路径
将脚本中所有相对路径替换为绝对路径,保证 crontab
在任何工作目录下都能正确找到所需的资源。 这尤其适用于 server.jar
的路径。
-
修改
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>
要替换成服务器账号的实际用户名。 记得修改Xms
和Xmx
以符合服务器的实际要求,这部分需要提前计算并修改好。确保路径精确无误,避免任何的笔误或者拼写错误。 -
修改
crontab
文件:在终端输入
crontab -e
编辑crontab
文件,内容替换成:0 1 * * * reboot @reboot sleep 60 && /home/<user>/mcserver/start.sh
操作步骤:
在上面的
@reboot
指令前加入了sleep 60 &&
这段代码, 它的含义是让机器重启以后等待 60 秒,之后执行start.sh
,可以减少因为机器正在初始化还没有完全进入可以启动状态就执行脚本导致服务器启动失败的情况。<user>
同步修改成你的服务器用户账号名称。
方法二:切换到工作目录
在脚本开头增加 cd
命令,先将工作目录切换到 Minecraft 服务器所在的目录,然后再执行相关操作,这可以处理相对路径失效问题。
-
修改
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
)就都正确了。Xms
和Xmx
内存配置按照自己的情况配置。 -
crontab
文件维持不变:crontab
部分沿用上一个方法,不需要额外调整,sleep 60
让启动延迟的这个设置对大多数服务器是有益的。
方法三:显式设置 PATH
变量
有些情况下,crontab
的 PATH
变量可能未包含 Java 可执行文件的路径,导致 java
命令无法找到。 可以在 start.sh
脚本中手动指定 Java 可执行文件的绝对路径。
-
修改
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 的安装位置调整PATH
和java
的绝对路径。大多数情况下 java 都会安装在上述路径里。 类似/usr/lib/jvm/<java-version>/bin/java
路径也是可能的。确认java的具体路径可以使用which java
命令查看,注意在有多个java环境的情况,which java
返回的路径可能是符号链接而不是绝对路径。请确保替换Xms
Xmx
并匹配实际机器配置,并修改 Minecraft server 安装路径。 -
crontab
文件维持不变:crontab
文件不需要做任何改动,维持前面方法中的内容。
方法四:使用 sudoers
在某些严格的环境下,crontab
可能需要以 root 身份运行某些 screen
或者 java
等命令。 需要仔细考量这样做带来的风险,并避免将所有的程序都添加到 sudoers,而是只增加必要项,使用 sudo 命令来提权执行某些特定操作。需要增加对 sudoers 的配置以避免 sudo
需要输入密码的问题。
-
编辑
sudoers
文件:运行
sudo visudo
编辑/etc/sudoers
文件, 添加如下一行:<user> ALL=(ALL) NOPASSWD: /usr/bin/screen
这里的
<user>
是你用来启动 minecraft 的账户用户名。 这意味着用户可以不需要密码就可以执行sudo /usr/bin/screen
这个指令。 这样做潜在的安全隐患需要注意,必须谨慎使用,确认授权范围合理有效,并且用户拥有足够安全知识。 -
修改
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 screen
和which java
查询命令来确保screen
和java
的路径都是准确的。 -
crontab
文件需要适当调整
crontab
保持跟前面一样,在需要的情况下,调整sleep
时间。
```
0 1 * * * reboot
@reboot sleep 60 && /home/<user>/mcserver/start.sh
```
额外安全建议
- 尽量不要使用 root 用户直接启动 Minecraft 服务器。创建一个单独的用户,并且使用 sudo 来赋予必要权限。
- 使用
ufw
或iptables
等防火墙软件来保护你的服务器,并限制仅允许的端口的连接。 - 定期备份 Minecraft 服务器的数据,以防止数据丢失。
- 定期检查并更新操作系统,
Java
环境,以及 Minecraft 服务器的版本,以避免安全漏洞。
每个方法都需要根据自身环境做相应的调整,切勿生搬硬套, 需要仔细测试每个方案的最终运行效果。