我尝试在启动 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
我尝试运行的关键命令是“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
如果有人能告诉我哪里错了,我将不胜感激。
答案1
该进程未运行的原因是 Amazon EC2 Linux 实例类似于 Red-Hat,并且这些发行版中存在一个错误/功能,即 sudo 命令需要 tty。处理 cloud-init 时没有将 tty 附加到环境,因此失败。
一个答案是编辑 etc/sudoers 并更改行
Defaults requiretty
到
Defaults !requiretty
显然还有其他方法,但这对我有用。
答案2
我猜测这个命令没有附加任何 shell。
代替
- echo 'Woot 1!' > /home/ec2-user/woot1.txt
尝试
- /bin/sh -c "echo 'Woot 1!' > /home/ec2-user/woot1.txt"