不活动时自动关闭服务器(SSH)?

不活动时自动关闭服务器(SSH)?

我有一台服务器托管在EC2. 服务器建立在Linux AMI,基于 CentOS。它专用于一个客户项目,我通过 SSH 连接。有时,我在不使用时会忘记关闭服务器,因此会产生不必要的成本。

如何让服务器在不活动时自动关闭,例如30 分钟后没有 SSH 连接?

当然,我正在寻找最简单的解决方案。每小时检查一次也可以,只要能可靠地工作就行。

答案1

截至 2013 年 1 月亚马逊云监控提供选项使用 Amazon CloudWatch 检测并关闭未使用的 Amazon EC2 实例请参阅介绍性博客文章Amazon CloudWatch - 警报操作有关此功能的详细信息:

今天我们让你能够停止或终止触发 CloudWatch 警报时您的 EC2 实例。您可以将其用作故障保护(检测异常情况然后采取行动)或作为应用程序处理逻辑的一部分(等待预期情况然后采取行动)。[重点是我的]

您的用例列于第节安全理念具体来说:

如果您(或您的开发人员)健忘,您可以检测未使用的 EC2 实例并将其关闭。您可以通过检测长时间内非常低的平均负载来做到这一点。这种故障保护可用于确保您不会为实际上未使用的资源付费,从而减少您的 AWS 账单。

如上所述,这取决于能否启发式地检测触发警报和停止实例的适当条件 - 您可以通过以下方式将其提升到一个新的水平发布自定义指标根据登录的 SSH 用户数、空闲时间等信息监控 CloudWatch,从而对所需的检测和关闭过程获得更多的控制/精度。

答案2

对于不需要设置其他服务且不依赖于使用情况指标的独立解决方案,请将此脚本设置为按计划运行:

#!/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

要每 5 分钟运行一次此脚本,并在 10 分钟不活动后关闭实例,请将此条目添加到/etc/crontab

*/5 *   * * *   root    /home/ubuntu/bin/shutdown-if-inactive

更改/home/ubuntu/bin为保存脚本的路径。

这是在运行 Ubuntu 20.04 的 EC2 实例上测试的。请参阅来源

这扩展了@dmohr 的回答。

答案3

您可以在实例本身上创建一个 cron 作业脚本,使用如下命令

netstat | grep ssh | grep ESTABLISHED

如果没有返回结果,则将其写入文件,然后 cron 再次尝试,如果再次没有返回结果,则脚本运行该脚本。

/sbin/shutdown -h now

答案4

我还有一些仅偶尔使用的 EC2 实例。这是一个 systemd 服务当一段时间内没有 SSH 活动时,我会关闭实例。

相关内容