我根据需要在亚马逊上开了一个AMI。启动时,我想运行一些bash命令,如“3.配置实例详细信息 - >高级详细信息 - >用户数据”中所示。我的命令如下:
#!/bin/bash
sudo yum update -y
aws s3 cp s3://mynotebook notebooks/ --recursive
nohup jupyter notebook
当我访问我启动的实例时,硬盘空间被用尽,好像文件被复制了,但我找不到它们!
如果我启动一个实例,然后SSH进入机器并运行这些命令,硬盘驱动器的大小与第一种方法相同(正如预期的那样)但是,文件在notebooks目录中可用,这也是预期的结果。
使用启动命令时,这些文件在哪里?此外,jupyter笔记本不会作为nohup命令的一部分启动。我在发布时无法使用这些命令吗?
问题
用户数据以root身份运行,因此这些文件由root拥有,并在根“/”目录(而不是用户的主页“〜”)中创建。来自AWS文档:
作为用户数据输入的脚本以root用户身份执行,因此请勿在脚本中使用sudo命令。请记住,您创建的任何文件都将由root拥有;如果您需要非root用户具有文件访问权限,则应在脚本中相应地修改权限。
你能做什么?
为了能够访问您的文件,您有两种选择:
要验证问题的原因是文件的权限,请更改为root用户并检查根目录中的文件。
首先,使用普通用户(ec2-user,ubuntu等)将ssh发送到机器:
ssh -i key.pem ec2-user@<your_ec2_public_dns_or_ip>
然后,切换到root用户:
sudo su
您的终端提示将变为“#”表示开关。切换到根目录:
cd /
现在,列出所有具有权限的文件和目录:
ls -al
验证您的文件是否存在。另外,请注意所有者“root”的名称。
一旦你验证了问题,让我们继续实际的解决方案;更改下载文件的所有者和位置。
假设您有一个名为ec2-user的普通用户,请将脚本修改为以下内容:
#!/bin/bash
sudo yum update -y
# Change to the user's home directory
cd /home/ec2-user
# A directory called notebooks will be created in the current directory; ie, /home/ec2-user
aws s3 cp s3://mynotebook notebooks/ --recursive
# Change the owner and group of the notebooks' directory and all its children
chown --recursive ec2-user:ec2-user notebooks
# Run jupyter as the ec2-user
runuser -l ec2-user -c 'nohup jupyter notebook'
# TODO Extract the ec2-user value to a variable
资源
Use chown to set the ownership of all a folder's subfolders and files?
当通过第一种方法复制时,文件将由root用户复制并拥有。
你有权访问这些文件吗?如果合适,使用“chown”更改文件的所有权。
对接受的答案的小调整 - 改变目录和复制文件对我来说不起作用,我将脚本修改为下面的工作
#!/bin/bash
yum update -y
aws s3 cp s3://notebooks /home/ec2-user/notebooks/ --recursive
chown --recursive ec2-user:ec2-user /home/ec2-user/notebooks/
runuser -l ec2-user -c 'nohup jupyter notebook'