Tom*_*lee 5 amazon-ec2 cloud-init
我正在尝试在启动 EC2 (Amazon Linux) 时启动长时间运行的命令,但未能成功。它需要在 ec2-user 帐户下运行。这是我的第一次尝试:
#!/bin/bash
echo 'Woot 1!' > /home/ec2-user/woot1.txt
pushd /home/ec2-user/my-app-dir
nohup sudo -u ec2-user /home/ec2-user/my-app-dir/my_process.py &
echo 'Woot 2!' > /home/ec2-user/woot2.txt
Run Code Online (Sandbox Code Playgroud)
我试图运行的关键命令是“nohup”行,用于运行 my_process.py。
当我从 shell 以 root 身份运行它时,shell 脚本可以工作,但是当我在用户数据中将它提供给 ec2-run-instances 并登录到实例时,我看到了 woot1.txt 和 woot2.txt,但是 my_process.py没有运行。更重要的是,my_process.py 在运行时会创建一个日志文件,但是当我将脚本作为用户数据提供给 ec2-run-instances 时,那里没有日志文件(也没有 nohup.out)。
我也尝试将相同的东西放在 cloud-init 形式中,结果相同:
#cloud-config
runcmd:
- echo 'Woot 1!' > /home/ec2-user/woot1.txt
- pushd /home/ec2-user/my-app-dir
- nohup sudo -u ec2-user /home/ec2-user/my-app-dir/my_process.py &
- echo 'Woot 2!' > /home/ec2-user/woot2.txt
Run Code Online (Sandbox Code Playgroud)
如果有人能告诉我哪里出错了,我将不胜感激。
该进程未运行的原因是 Amazon EC2 Linux 实例与 Red-Hat 类似,并且这些发行版中存在一个错误/功能,即 sudo 命令需要 tty。处理 cloud-init 时,没有附加到环境的 tty,因此失败。
一种答案是编辑 etc/sudoers 并更改行
Defaults requiretty
Run Code Online (Sandbox Code Playgroud)
到
Defaults !requiretty
Run Code Online (Sandbox Code Playgroud)
显然还有其他方法,但这对我有用。