De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
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.