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

我正在尝试启动一个EC2(亚马逊Linux),并且没有启动一个长期运行的命令。 它需要在ec2用户帐户下运行。 这是我第一次尝试:

#!/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脚本在shell中以root用户身份运行时会起作用,但是当我将其以user-data的forms提供给ec2-run-instances并login到实例时,我同时看到woot1.txt和woot2.txt,但是my_process.py没有运行。 更重要的是,my_process.py在运行时会创build一个日志文件,但是当我将脚本作为用户数据提供给ec2-run-instances时,那里没有日志文件(也没有nohup.out)。

我已经尝试把相同的东西放在一个云初始化的forms,以及相同的结果:

 #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 

如果有人能告诉我哪里出错了,我会很感激。

这个过程没有运行的原因是Amazon EC2 Linux实例是Red-Hat,并且在sudo命令需要tty的发行版中存在一个bug /function。 在处理cloud-init时,环境中没有附加的tty,因此失败。

一个答案是编辑etc / sudoers并更改行

 Defaults requiretty 

 Defaults !requiretty 

还有其他的方法,显然,但这对我来说很有效。

我猜这个命令没有附加shell。

代替

 - echo 'Woot 1!' > /home/ec2-user/woot1.txt 

尝试

 - /bin/sh -c "echo 'Woot 1!' > /home/ec2-user/woot1.txt"