在 ec2 实例上的 cloud-init 中启动一个长时间运行的进程

在 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

我尝试运行的关键命令是“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"

相关内容