fek*_*lee 10 linux ssh centos amazon-ec2
我在EC2 上托管了一台服务器。服务器建立在Linux AMI 上,基于 CentOS。它专用于客户端项目,我通过 SSH 连接。有时,我忘记在不使用时关闭服务器,从而产生不必要的成本。
如何使服务器在不活动时自动关闭,例如30 分钟后没有 SSH 连接?
当然,我正在寻找最简单的解决方案。每隔一小时左右检查一次也可以,只是工作可靠的东西。
截至 2013 年 1 月,Amazon CloudWatch提供了使用 Amazon CloudWatch 检测和关闭未使用的 Amazon EC2 实例的选项,有关此功能的详细信息,请参阅介绍性博客文章Amazon CloudWatch - 警报操作:
今天,我们让您能够在触发 CloudWatch 警报时停止或终止您的 EC2 实例。您可以将其用作故障保护(检测异常情况然后采取行动)或作为应用程序处理逻辑的一部分(等待预期情况然后采取行动)。[强调我的]
您的用例在Failsafe Ideas部分特别列出:
如果您(或您的开发人员)健忘,您可以检测未使用的 EC2 实例并将其关闭。您可以通过在很长一段时间内检测到非常低的平均负载来做到这一点。这种类型的故障保护可用于确保您无需为实际未使用的资源付费,从而减少您的 AWS 费用。
至于提到的,这取决于是否能够启发式检测适当的条件触发报警并停止实例-你可以把它带到一个新的水平借助发布自定义指标基础上,以CloudWatch的登录SSH用户数,空闲时间或否则,依次为所需的检测和关闭过程获得更多控制/精度。
对于不需要设置其他服务且不依赖于使用指标的独立解决方案,请将此脚本设置为按计划运行:
#!/bin/bash
#
# Shuts down the host on inactivity.
#
# Designed to be executed as root from a cron job.
# It will power off on the 2nd consecutive run without an active ssh session.
# That prevents an undesirable shutdown when the machine was just started, or on a brief disconnect.
#
# To enable, add this entry to /etc/crontab:
# */5 * * * * root /home/ubuntu/dotfiles/bin/shutdown-if-inactive
#
set -o nounset -o errexit -o pipefail
MARKER_FILE="/tmp/ssh-inactivity-flag"
STATUS=$(netstat | grep ssh | grep ESTABLISHED &>/dev/null && echo active || echo inactive)
if [ "$STATUS" == "inactive" ]; then
if [ -f "$MARKER_FILE" ]; then
echo "Powering off due to ssh inactivity."
poweroff # See https://unix.stackexchange.com/a/196014/56711
else
# Create a marker file so that it will shut down if still inactive on the next time this script runs.
touch "$MARKER_FILE"
fi
else
# Delete marker file if it exists
rm --force "$MARKER_FILE"
fi
Run Code Online (Sandbox Code Playgroud)
要每 5 分钟运行一次此脚本,并在 10 分钟不活动后关闭实例,请将此条目添加到/etc/crontab:
*/5 * * * * root /home/ubuntu/bin/shutdown-if-inactive
Run Code Online (Sandbox Code Playgroud)
更改/home/ubuntu/bin为保存脚本的路径。
这是在运行 Ubuntu 20.04 的 EC2 实例上进行测试的。参见源码。
这扩展了@dmohr 的答案。
小智 5
您可以在实例本身上创建一个 cron 作业脚本,该脚本使用类似的命令
netstat | grep ssh | grep ESTABLISHED
Run Code Online (Sandbox Code Playgroud)
如果没有返回结果,将其写入文件,然后 cron 再次尝试,如果它再次没有返回结果,脚本将运行它。
/sbin/shutdown -h now
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6288 次 |
| 最近记录: |