Ubuntu系统下Crontab结合Screen重启后无法启动Minecraft服务器
问题分析与解决步骤
1. 修复crontab语法错误
你的@reboot配置写法完全错误,@reboot本身就是代表系统重启后执行的特殊时间规则,不能再追加5 * * * *这类时间参数。如果要实现重启后延迟5分钟执行脚本,正确写法是用sleep命令:
@reboot sleep 300 && /home/你的用户名/mcserver/start.sh
(替换你的用户名为实际服务器用户名)
2. 解决crontab环境变量差异问题
crontab的执行环境和用户命令行环境完全不同,这是最常见的触发失败的原因:
- 替换波浪号为绝对路径:crontab中
~不会被正确解析为用户家目录,所有路径都要写绝对路径,比如把脚本里的~/mcserver换成/home/你的用户名/mcserver - 指定screen和java的绝对路径:crontab的PATH变量不包含所有系统命令路径,先在命令行执行以下命令获取绝对路径:
然后把脚本里的which screen # 示例输出:/usr/bin/screen which java # 示例输出:/usr/lib/jvm/java-17-openjdk-amd64/bin/javascreen和java替换成上述绝对路径 - server.jar用绝对路径:脚本里直接写
server.jar会在crontab默认工作目录(通常是用户家目录)查找,必须改成/home/你的用户名/mcserver/server.jar
3. 完善脚本日志,方便排查问题
原脚本没有错误日志输出,无法定位失败原因,修改脚本如下(同时修正你脚本里重复的-Xmx参数,应该是初始堆-Xms+最大堆-Xmx):
#!/bin/sh LOG_FILE="/home/你的用户名/mcserver/start.log" echo "[$(date +'%Y-%m-%d %H:%M:%S')] 开始启动MC服务器..." >> $LOG_FILE # 使用绝对路径的screen、java和server.jar,同时记录错误输出 /usr/bin/screen -dmS Server /usr/lib/jvm/java-17-openjdk-amd64/bin/java -Xms2G -Xmx7G -jar /home/你的用户名/mcserver/server.jar nogui >> $LOG_FILE 2>&1 # 追加当前screen会话列表,验证是否创建成功 echo "[$(date +'%Y-%m-%d %H:%M:%S')] 当前Screen会话列表:" >> $LOG_FILE /usr/bin/screen -list >> $LOG_FILE 2>&1
4. 确认脚本权限
确保脚本有执行权限(虽然你命令行能运行,但crontab环境可能有差异):
chmod +x /home/你的用户名/mcserver/start.sh
5. 验证crontab配置
编辑完crontab后,重启cron服务生效:
sudo systemctl restart cron
可以手动重启服务器测试,或者用以下命令模拟crontab环境执行脚本,提前发现问题:
env -i PATH=/usr/bin:/bin /home/你的用户名/mcserver/start.sh
内容的提问来源于stack exchange,提问作者WillTheWA
相关产品推荐
相关产品推荐

