você está aqui: Home  → Arquivo de Mensagens

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