在 AWS Centos 7 实例中启动时允许 bash 脚本到 运行
Allow a bash script to run at boot in AWS Centos 7 instance
我需要为客户创建 AWS CentOS 7 实例映像,并需要它在每次实例启动时自动将 ip 和实例 ID 发送到我们的 AWS 服务器。例如,这是我需要 运行:
的非常基本的脚本测试版本
#!/bin/bash
$serverIP=""
curl "https://$serverIP"/myphp.php?id='sentid'&ip='sentip'"
如果脚本是直接运行,它工作正常并且被服务器接收并在那里处理。但是我无法在启动时将其设置为 运行。出于安全考虑,我不能将脚本直接放在“用户数据”中,因为客户可以很容易地看到它,它需要放在图像文件系统的脚本中。
我已经尝试了几种在物理 Linux 服务器上运行良好但在 AWS 上运行良好的方法。我知道每次有人登录时 profile.d 运行s,但这样过度发送没问题。
/etc/profile.d/myscript.sh
这会阻止 AWS 实例启动。甚至只是
#!/bin/bash/
echo "hello world"
阻止它启动。实例启动,但是当您使用 ssh 进入它时,您会得到 'Network Error: connection timed out',这是标准错误,如果您输入了错误的 ip,或者通过启用 httpd 之类的服务来扰乱它。
但是,仅包含 #!/bin/bash 的空白 bash 脚本将允许实例启动。通过用户数据删除脚本 通常 使其启动,有时它就死掉了。
我首先尝试的是 crontab。我做到了:
crontab -e
@reboot /var/ook/myscript.sh
systemctl enable crond.service
但是实例无法启动。所以我在用户数据中放入“systemctl disable crond.service”,一个启动了,但另一个仍然死机。 Myscript.sh 只是另一个 echo "doob" >> 文件,直接 运行 时工作正常。
我试着输入 /etc/systemd/system/my-startup.service:
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/var/ook/writedood.sh
[Install]
WantedBy=multi-user.target
然后:
systemctl enable my-startup.service
但这没有任何作用。我的脚本“writedood.sh”只是 echo “doob”>> ./file.txt 确保 file.txt 是 chmod 777。至少它没有阻止实例启动。
为了提供上下文,如果 httpd 在关闭时启用,实例将不会启动,但如果您在用户数据中禁用它,实例将不会启动。
我想尝试在 init.d 中添加一些东西,但我不确定如何在后台将它简单地告诉 运行 一个脚本,并获得大量成功到目前为止,我的实例没有重新启动,我不抱太大希望它会起作用。
提前致谢!
编辑::: 我意识到有时 AWS EC2 实例控制台会导致我在停止和启动后无法通过 ssh 登录的问题。当我单击停止时,它会清空 public ipv4 地址,但当我开始时,它会保留旧地址并挂起。如果我刷新页面,或者 uncheck/check 实例; ip更改为新地址。这引起了很大的恐慌。
如果我将脚本和输出文件放在不同的文件夹中,Crontab 就会工作。这非常挑剔;任何错误,例如它无法写入输出文件,并且实例不会启动。我将 startscript.sh
放入 /usr/local/src
,并将 output.out
放入 /tmp/
以确保没有权限问题,现在实例启动并在启动时运行脚本。
然后我意识到有时 AWS EC2 实例控制台会导致我在停止和启动后无法通过 ssh 登录的问题。当我单击停止时,它会清空 public ipv4 地址,但当我开始时,它会保留旧地址并挂起。如果我刷新页面,或者uncheck/check实例; ip更改为新地址。这引起了很大的恐慌。
我需要为客户创建 AWS CentOS 7 实例映像,并需要它在每次实例启动时自动将 ip 和实例 ID 发送到我们的 AWS 服务器。例如,这是我需要 运行:
的非常基本的脚本测试版本#!/bin/bash
$serverIP=""
curl "https://$serverIP"/myphp.php?id='sentid'&ip='sentip'"
如果脚本是直接运行,它工作正常并且被服务器接收并在那里处理。但是我无法在启动时将其设置为 运行。出于安全考虑,我不能将脚本直接放在“用户数据”中,因为客户可以很容易地看到它,它需要放在图像文件系统的脚本中。
我已经尝试了几种在物理 Linux 服务器上运行良好但在 AWS 上运行良好的方法。我知道每次有人登录时 profile.d 运行s,但这样过度发送没问题。
/etc/profile.d/myscript.sh 这会阻止 AWS 实例启动。甚至只是
#!/bin/bash/
echo "hello world"
阻止它启动。实例启动,但是当您使用 ssh 进入它时,您会得到 'Network Error: connection timed out',这是标准错误,如果您输入了错误的 ip,或者通过启用 httpd 之类的服务来扰乱它。
但是,仅包含 #!/bin/bash 的空白 bash 脚本将允许实例启动。通过用户数据删除脚本 通常 使其启动,有时它就死掉了。
我首先尝试的是 crontab。我做到了:
crontab -e
@reboot /var/ook/myscript.sh
systemctl enable crond.service
但是实例无法启动。所以我在用户数据中放入“systemctl disable crond.service”,一个启动了,但另一个仍然死机。 Myscript.sh 只是另一个 echo "doob" >> 文件,直接 运行 时工作正常。
我试着输入 /etc/systemd/system/my-startup.service:
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/var/ook/writedood.sh
[Install]
WantedBy=multi-user.target
然后:
systemctl enable my-startup.service
但这没有任何作用。我的脚本“writedood.sh”只是 echo “doob”>> ./file.txt 确保 file.txt 是 chmod 777。至少它没有阻止实例启动。
为了提供上下文,如果 httpd 在关闭时启用,实例将不会启动,但如果您在用户数据中禁用它,实例将不会启动。
我想尝试在 init.d 中添加一些东西,但我不确定如何在后台将它简单地告诉 运行 一个脚本,并获得大量成功到目前为止,我的实例没有重新启动,我不抱太大希望它会起作用。
提前致谢!
编辑::: 我意识到有时 AWS EC2 实例控制台会导致我在停止和启动后无法通过 ssh 登录的问题。当我单击停止时,它会清空 public ipv4 地址,但当我开始时,它会保留旧地址并挂起。如果我刷新页面,或者 uncheck/check 实例; ip更改为新地址。这引起了很大的恐慌。
如果我将脚本和输出文件放在不同的文件夹中,Crontab 就会工作。这非常挑剔;任何错误,例如它无法写入输出文件,并且实例不会启动。我将 startscript.sh
放入 /usr/local/src
,并将 output.out
放入 /tmp/
以确保没有权限问题,现在实例启动并在启动时运行脚本。
然后我意识到有时 AWS EC2 实例控制台会导致我在停止和启动后无法通过 ssh 登录的问题。当我单击停止时,它会清空 public ipv4 地址,但当我开始时,它会保留旧地址并挂起。如果我刷新页面,或者uncheck/check实例; ip更改为新地址。这引起了很大的恐慌。