在 EC2 实例启动后运行 bash 脚本

在 EC2 实例启动后运行 bash 脚本

我在 EC2 实例上有一个可以远程启动另一个实例的脚本。

一旦该实例完全加载(完成启动),我希望它自动运行 bash 脚本,最好的方法是什么?

我需要一切都完全启动,基本上 bash 脚本运行一个图像转换脚本(使用 ImageMagick 并执行“wget”命令几次)

目前,脚本位于此处:

/home/root/beginProcess.sh

我可以通过执行手动启动它

开始进程

RHEL-6.2-入门版-EBS-i386

另外,还有一个附加的 EBS 卷,如果有帮助的话,谢谢!

答案1

我建议使用用户数据选项ec2-run-instances。它允许您向虚拟机提供某种脚本,该脚本将在首次启动时运行。如果您使用的是 ubuntu 或 debian,则可以使用云初始化,这为该过程增添了一些亮点。如果使用 cloud-init,您可以使用[runcmd]配置文件的部分来指定启动后要运行的任意命令。

感谢SF用户艾瑞克·哈蒙德了解用户数据页面。查看他的地点- 它拥有有关 AWS 的丰富信息。

编辑:重新阅读后,不清楚您是想在首次启动时还是每次启动时运行命令。上述说明仅适用于首次启动。如果您想在每次启动时运行命令,您有几个选择 - 您可以通过 cron 指令运行命令@reboot,或者您可以将脚本添加到/etc/rc.local,该脚本将在系统每次启动时运行。

答案2

如果您使用已安装软件包的 AMI cloud-init(如 Amazon Linux 或 Ubuntu),那么您只需将 bash 脚本(以 #! 开头)作为用户数据文件传递,它就会在启动过程结束时自动运行。

例如,它可以简单到:

ec2-run-instances                             \
  --user-data-file /home/root/beginProcess.sh \
  --key $USER                                 \
  ami-XXXXXXXX

这是我介绍用户数据脚本概念的文章,现在可在主要的 EC2 AMI(如 Amazon Linux 和 Ubuntu)中使用:http://alestic.com/2009/06/ec2-user-data-scripts

不幸的是,您似乎想要使用 RHEL AMI。我运行了它的副本,但找不到任何关于 cloud-init 或在首次启动时运行用户数据脚本的引用,也没有对相同的工作进行测试。

我并不是说你应该仅仅为了这个而切换 Linux 发行版,但是 Amazon Linux 基于 RHEL,所以这可能适合你。

这是我写的一篇文章,如果第一次无法正常工作,它可能会帮助您调试用户数据脚本:http://alestic.com/2010/12/ec2-用户数据输出

答案3

这是一个老问题,但我在任何地方都找不到好的答案。我的用例是需要在现存的由于实例被关闭并按照计划重新启动,因此实例已停止运行。

典型的答案是使用 EC2 用户数据,但这对我来说似乎不起作用。要么是因为用户数据仅用于在新建实例(例如用于扩展的引导实例),或者因为文档已过时。不确定是哪种情况,但我没有成功让任何东西工作。显然有某种方法可以在每次现存的实例开始显示在此处:如何让 EC2 用户数据脚本在启动时再次运行?,但这对我来说根本不起作用。什么都没有发生。

摸索了一段时间后,我决定尝试一下,只需修改 EC2 实例上的 .bashrc 文件,瞧,它完全按照预期工作,并在实例启动时运行我的命令。这几乎太明显了,但有点令人惊讶的是,它没有在任何地方提到。

答案4

如何使用 EC2 UserData 运行脚本的权威来源每一次您的实例启动是这里简而言之,我在实例上创建一个脚本(确保使其可执行),然后我使用以下用户数据脚本:

Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
cloud_final_modules:
- [scripts-user, always]

--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"

/path/to/script.sh
--//

您只需更改倒数第二行以指向您的脚本。

我发现的另一个技巧是,如果你已经在尝试这个,并且有一些其他实例上的 UserData 脚本,它缓存在机器上,并且没有更新当您更改 UserData 脚本时。要强制实际使用新的 UserData 脚本,您需要cloud-init clean在实例上运行以清除 UserData 缓存。

相关内容