使用屏幕命令与 aws ec2 启动脚本不起作用

使用屏幕命令与 aws ec2 启动脚本不起作用

我试图在我的 ec2 实例启动时立即启动一个 minecraft 服务器(它有一个 CloudWatch 事件来每天停止和启动该实例,因此当它启动时我需要启动服务器)

我的服务器文件夹位于其中/home/ec2-user/minecraft/,并且在这个文件夹中我有一个启动服务器运行以下命令的脚本:

java -Xmx1024M -Xms1024M -jar minecraft_server.1.15.2.jar nogui

我可以手动使用screen它在后台启动服务器,并且它运行良好,我可以退出我的 ssh 会话,服务器仍在运行。

但是当我尝试screen在启动脚本中使用时,屏幕会话没有启动。以下是我迄今为止尝试过的 3 件事:

  1. 添加了一个开机启动服务器.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)

  1. 在文件中添加了脚本/etc/rc.local。还手动测试了它,并且它可以工作,但是当实例启动时它却不行(没有创建屏幕会话)。

  2. 使用相同命令将脚本添加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 身份运行,因此无法找到命令javaminecraft文件夹,因为这些只能从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命令,并且服务器启动后就会创建屏幕会话

相关内容