você está aqui: Home  → Arquivo de Mensagens Programação Shell Linux: Inscrições Abertas

Desligar e ligar automaticamente servidores todos os dias

Colaboração: Wendell Almeida

Data de Publicação: 14 de dezembro de 2012

Podemos colaborar com a TI verde desligando servidores que não necessitam ficar ligados 24hs por dia 7 dias por semana.

Pensando em uma empresa que funciona somente em horário comercial de segunda a sexta feira entre 09:00 e 18:00hs, podemos realizar uma programação para que automaticamente o servidor desligue por volta das 20:00hs e ligue no dia seguinte às 08:55hs, permanecendo desligado sábado e domingo.

O script abaixo realiza essa operação:

#!/bin/bash

logger=$(which logger)
test -x $logger || exit 1

# Horário que o servidor será ligado
HOUR_UP="08:55:00"

# Primeira segunda do mês o servidor não será desligado
WEEKDAY1=Mon

LANG=C
LC_ALL=C
DATE=$(date +%a)
DAY=$(date +%d)
shutdown=$(which shutdown)
poweroff="$shutdown -h now"
THIS="shutdown_system"
date="date -u"
WAKEALARM=/sys/class/rtc/rtc0/wakealarm

## Ligar o servidor na data e horário definidos
wakeup(){
   echo 0 > $WAKEALARM
   test "$DATE" = "Fri" && $date -d "+ 3 day $HOUR_UP" +%s > $WAKEALARM
   test "$DATE" = "Sat" && $date -d "+ 2 day $HOUR_UP" +%s > $WAKEALARM
   $date -d "+ 1 day $HOUR_UP" +%s > $WAKEALARM
#cat /proc/driver/rtc 
}

## Desligar o servidor
halt(){
   $logger -t $THIS "The System Shutdown!!"
   wakeup
   $poweroff
   exit 0
}

## Verifica se o servidor será desligado ou não
validate(){
   test $DAY -lt 7 || halt
   test "$WEEKDAY1" = "$DATE" || halt
   $logger -t $THIS "The System NOT Shutdown!!"
}

validate

Salve o script com o nome zzzshutdown e copie para /etc/cron.daily.

Ele deve ser o último script a ser executado para não interferir na execução das outras tarefas diárias. Por isso iniciei o nome com zzz.

Agende as tarefas semanais e mensais no cron para que sejam executas quando o servidor estiver ligado. Exemplo: /etc/crontab

17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
00 20    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
00 13    * * 4   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )

# Toda primeira segunda feira do mês será executado os scripts mensais
30 12  * * 1   root     test `date +\%d` -gt 7 || ( cd / && run-parts --report /etc/cron.monthly )

# Tarefa que será executada na primeira terça do mês durante a madrugada.
# O servidor não deverá ser desligado.
00 1    * * 2   root    test `date +\%d` -gt 7 || /usr/slib/system.diagnostic

Sistema aplicado: Debian Squeeze. Talvez seja necessário ajustes para outras distribuições.



Veja a relação completa dos artigos de Wendell Almeida