Amazon-Ec2

在 ec2 實例上的 cloud-init 中啟動一個長時間執行的程序

  • August 12, 2015

我正在嘗試在啟動 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

如果有人能告訴我哪裡出錯了,我將不勝感激。

該程序未執行的原因是 Amazon EC2 Linux 實例類似於 Red-Hat,並且在這些發行版中存在一個錯誤/功能,即 sudo 命令需要 tty。處理 cloud-init 時,環境沒有附加 tty,因此失敗。

一個答案是編輯 etc/sudoers 並更改行

Defaults requiretty

Defaults !requiretty

顯然,還有其他方法,但這對我有用。

我猜這個命令沒有附加外殼。

代替

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

嘗試

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

引用自:https://serverfault.com/questions/713005