Amazon-Ec2
在 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
如果有人能告訴我哪裡出錯了,我將不勝感激。
該程序未執行的原因是 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"