Автоматически выключать сервер при неактивности (SSH)?

7

У меня есть сервер, размещенный на EC2 . Сервер построен на Linux AMI , основанном на CentOS. Он посвящен клиентскому проекту, и я подключаюсь через SSH. Иногда я забываю отключить сервер, когда он не используется, что приводит к ненужным затратам.

Как сделать так, чтобы сервер автоматически отключался при неактивности, например, через 30 минут без подключения SSH?

Естественно, я ищу самое простое решение. Проверка каждый час или около того также будет в порядке, просто то, что работает надежно.

feklee
источник

Ответы:

6

По состоянию на январь 2013 года Amazon CloudWatch предоставляет возможность использовать Amazon CloudWatch для обнаружения и выключения неиспользуемых экземпляров Amazon EC2 , см. Вступительное сообщение в блоге Amazon CloudWatch - Действия по предупреждению для получения подробной информации об этой функции:

Сегодня мы даем вам возможность останавливать или прекращать работу ваших экземпляров EC2 при срабатывании тревоги CloudWatch . Вы можете использовать это в качестве отказоустойчивого (обнаружить ненормальное состояние и затем действовать) или как часть логики обработки вашего приложения (дождаться ожидаемого состояния и затем действовать). [акцент мой]

Ваш вариант использования указан в разделе « Идеи отказоустойчивости», а именно:

Если вы (или ваши разработчики) забываете, вы можете обнаружить неиспользуемые экземпляры EC2 и закрыть их. Вы можете сделать это, обнаружив очень низкое среднее значение нагрузки в течение длительного периода времени. Этот тип отказоустойчивости может быть использован для сокращения вашего счета AWS, если вы не будете платить за ресурсы, которые фактически не используете.

Как указано выше, это зависит от возможности эвристического обнаружения соответствующего условия, запускающего аварийный сигнал и останавливающего экземпляр - вы можете перейти на следующий уровень с помощью публикации пользовательских метрик в CloudWatch на основе количества зарегистрированных пользователей SSH, времени простоя или еще и получить больше контроля / точности для желаемого процесса обнаружения и отключения по очереди.

Штеффен Опель
источник
В качестве первого эксперимента я настроил будильник, который отключает случай, когда NetworkIn (в среднем за 5 минут) ниже 1000 байт (в минуту) в течение более 30 минут.
Фекли
2

Если все, что вам нужно, это поддерживать работу сервера, пока вы вошли в систему, и сеанс бездействует менее nединицы времени, вы можете сделать это с помощью скрипта cron, который вы упомянули, отслеживая вывод w(1)которого сообщает IDLEвремя для вошедшего в систему пользователя, которое вы можете использовать.

Ашиш ШУКЛА
источник
1
wдействительно выглядит интересно. Чтобы получить время простоя в секундах для пользователя ec2-user:w -hs ec2-user | sed -e 's/.* \([0-9]\+\.[0-9]\{2\}\)s .*/\1/'
feklee
Я думаю, что он хотел выключиться автоматически, если никто не вошел в систему в течение определенного периода времени?
Майкл Хэмптон
@MichaelHampton Я единственный пользователь.
Фекли
@feklee Если вы не вошли в систему, то «никто не вошел в систему» ​​:)
Майкл Хэмптон
5
@abbe Если вход nobodyв систему, то пришло время отформатировать и переустановить.
Майкл Хэмптон
2

Вы можете создать скрипт задания cron прямо на самом экземпляре, который использует такую ​​команду, как

netstat | grep ssh | grep ESTABLISHED

и если результат не возвращается, запишите его в файл, тогда cron пытается снова, и если он не возвращает результатов снова, скрипт запускает это.

/sbin/shutdown -h now
dmohr
источник
1

У меня также есть несколько экземпляров EC2, которые я использую только время от времени. Вот сервис systemd, который я сделал, который закрывает случай, когда в течение некоторого времени нет активности SSH.

Bokan
источник