O script a seguir foi desenvolvido após eu ter um problema no funcionamento da controladora dos fans do meu servidor FreeNAS que acabou por desligar todas as ventoinhas de refrigeração do gabinete que estavam sendo controladas pelo equipamento e como consequência, a temperatura dos disco rígidos subiram absurdamente. Felizmente eu estava em casa e percebi a falha, porém se eu estivesse na rua poderia ser tarde de mais…
O script monitora a temperatura dos HDDs do servidor e, caso a temperatura ultrapasse um valor pré-definido, o procedimento de desligamento automático do mesmo é iniciado.
MUITA ATENÇÃO!
Ao definir as variáveis “temp_shutd” e “tempo_shutd”, leve em consideração a temperatura normal de funcionamento dos discos rígidos e o tempo de inicialização do sistema para evitar um loop de reinicialização do sistema!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | #!/bin/bash ################################################################################## ## MUITA ATENCAO!: ## Ao definir as variaveis "temp_shutd" e "tempo_shutd", leve em consideracao ## a temperatura normal de funcionamento dos discos rigidos e o tempo de ## inicializacao do sistema para evitar um loop de reinicializacao do sistema ################################################################################## ### Define parametros de desligamento do sistema ### temp_shutd=44 # [[Use com sabedoria]] Temperatura em celcius para shutdown tempo_shutd=10 # [[Use com sabedoria]] Delay em minutos para o shutdown email="seu_endereco_de_email" # E-mail do destinatario do alerta assunto="FreeNAS [Alerta] Shutdown temperatura HDD" # Assunto do email # Define variavel de graus celcius CEL=$'\xe2\x84\x83' # Monta array de discos do sistema arrdiscs=($(camcontrol devlist | awk '{print substr($NF, 8, length($NF)-8)}')) # Cria array para o alerta de temperatura alertdiscs=() pohdiscs=() # Recupera a temperatura dos discos com base no arrdiscs for i in "${arrdiscs[@]}" do temp=("$(smartctl -A "/dev/$i" | egrep ^194 | awk '{print $10}')") if [ -n "$temp" ] && [ $temp -gt $temp_shutd ]; then alertdiscs+=("[$i]: $temp$CEL") fi done # Compara os valores de temperatura com a variavel temp_shutdown: gera alerta e desliga o NAS if [ ${#alertdiscs[@]} -gt 0 ]; then # Envia email com alerta de desligamento printf "%b " "Discos com temperatura acima do limite MAXIMO ($temp_shutd$CEL): ${alertdiscs[@]}" | /usr/bin/mail -s "$assunto" "$email" # Executa o comando de shutdown no tempo definido na variavel tempo_shutd /sbin/shutdown -p +${tempo_shutd} "ATENCAO: Desligando sistema. Temepratura dos HDDs excedida!" fi |
Vale lembrar que para o correto funcionamento do script, o mesmo deve ser configurado para ser executado periodicamente utilizando o cron.
No futuro irei complementar este script, ou criar um script separado, para o desligamento do servidor baseado na temperatura do(s) processador(es).