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

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)

如果有人能告诉我哪里出错了,我将不胜感激。

Tom*_*lee 3

该进程未运行的原因是 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)

显然还有其他方法,但这对我有用。