我试图在我的 ec2 实例启动时立即启动一个 minecraft 服务器(它有一个 CloudWatch 事件来每天停止和启动该实例,因此当它启动时我需要启动服务器)
我的服务器文件夹位于其中/home/ec2-user/minecraft/
,并且在这个文件夹中我有一个启动服务器运行以下命令的脚本:
java -Xmx1024M -Xms1024M -jar minecraft_server.1.15.2.jar nogui
我可以手动使用screen
它在后台启动服务器,并且它运行良好,我可以退出我的 ssh 会话,服务器仍在运行。
但是当我尝试screen
在启动脚本中使用时,屏幕会话没有启动。以下是我迄今为止尝试过的 3 件事:
- 添加了一个开机启动服务器.sh
/var/lib/cloud/scripts/per-boot
使用以下命令在脚本里面:
screen -dmS "minecraft" ~/minecraft/start-server.sh
我期望在这里完成的是启动一个独立的屏幕会话,服务器正在运行。如果我从per-boot
文件夹中手动运行此脚本,它会按预期工作。但是当它在启动期间运行时,它不起作用(当我通过 ssh 进入机器时,没有创建屏幕会话)
我检查了cloud-init.log
更多详细信息并且脚本运行时没有错误:
util.py[DEBUG]: Running command ['/var/lib/cloud/scripts/per-boot/start-server-on-boot.sh'] with allowed return codes [0] (shell=True, capture=False)
在文件中添加了脚本
/etc/rc.local
。还手动测试了它,并且它可以工作,但是当实例启动时它却不行(没有创建屏幕会话)。使用相同命令将脚本添加
User Data
到我的 ec2 实例中screen
,但效果不佳。测试运行其他命令,这些命令均有效(创建了一个foo.txt
文件)
我cloud-init.log
也检查了并且脚本运行时没有错误:
util.py[DEBUG]: Running command ['/var/lib/cloud/instance/scripts/userdata.txt'] with allowed return codes [0] (shell=True, capture=False)
我认为问题是由于某种原因屏幕会话终止。
我真的不知道我还能在这里尝试什么,真的希望我犯了一个愚蠢的错误,有人可以看到,我可以让这个东西工作(这是让一切正常运行所缺少的最后一件事)
答案1
最终发现是权限问题。AWS EC2 启动脚本以 root 身份运行,因此无法找到命令java
和minecraft
文件夹,因为这些只能从ec2-user
(即我使用 ssh 的那个)访问
start-server-on-boot.sh
因此解决方案是将脚本中的命令更改/var/lib/cloud/scripts/per-boot
为以下内容:
runuser -l ec2-user -c 'screen -dmS "minecraft" ~/minecraft/start_server.sh'
这样,它就能找到minecraft
文件夹和java
命令,并且服务器启动后就会创建屏幕会话