Ситуацию может помочь разрешить датчик температуры серверного помещения, контролируемый с серверов по сети или через COM/USB. Устройство заказано, жду уже долго. Дополнительно заказан зимний пакет для нового кондиционера (старый как раз скончался во время одного из перепадов напряжения), обещают поставить буквально на днях. Однако на дворе середина октября, морозы могут брякнуть в любой момент, а после остановки кондиционера без зимнего пакета его уже будет не запустить. Да и остальные форсмажоры никто не отменял.
На вопрос "что делать" ответ один - извернуться и минимизировать потери. Извернуться я решил с помощью встроенных датчиков температуры процессора и жестких дисков. Минимизировать потери - с помощью определения высоких и критических значений температуры (ниже аппаратно-критических, при которых система аварийно останавливается) и штатного завершения работы, если хотя-бы один из датчиков покажет превышение критического значения. В планах - генерировать отправку мне на электронную почту соответствующего сообщения, если датчики покажут превышение высокого значения.
Конечно, датчики процессора и жестких дисков не покажут точной картины, мало того, анализ датчиков температуры процессора может стать причиной остановки сервера, загруженного серьезной работой. Здесь главное найти баланс.
Теперь - инструментарий.
lm_sensors + драйвера для датчиков процессора. У меня это драйвера k8temp на одном из серверов и coretemp на остальных.
smartctl для получения значения температуры жесткого диска (более простой в использовании hddtemp оказался неработоспособен для моих RAID-контроллеров)
bash
cron
Практический анализ применимости инструментария показал, что все сервера, кроме одного старинного HP ProLiant DL380 G4, имеют датчики температуры процессора. Последний их то-же имеет, однако доступны они только через проприетарные драйвера, выпуск которых HP прекратил на ядре Linux 2.4. К счастью этот-же сервер имеет доступный датчик температуры на RAID-контроллере, в то время как остальные сервера такой радости не имеют. В целом получается удачно: на пролианте контролируем жесткие диски, на остальных серверах - процессоры.
Вот что получилось:
Скрипт /opt/sns/sns.sh, вариант для RAID на HP ProLiant DL380 G4.
Подсветка синтаксиса языка bash
!/bin/bash
high=40
critical=60
((hcount=ccount=0))
sns=`smartctl -A -d cciss,0 /dev/cciss/c0d0`
for f in `echo "$sns" | sed -nr 's/(Current Drive Temperature.*)([0-9][0-9])(.*)/\2/p'`
do
if ((f>high))
then
((hcount++))
fi
if ((f>critical))
then
((ccount++))
fi
done
if ((ccount>0))
then
poweroff
fi
high=40
critical=60
((hcount=ccount=0))
sns=`smartctl -A -d cciss,0 /dev/cciss/c0d0`
for f in `echo "$sns" | sed -nr 's/(Current Drive Temperature.*)([0-9][0-9])(.*)/\2/p'`
do
if ((f>high))
then
((hcount++))
fi
if ((f>critical))
then
((ccount++))
fi
done
if ((ccount>0))
then
poweroff
fi
Скрипт /opt/sns/sns.sh, вариант для остальных серверов:
Подсветка синтаксиса языка bash
#!/bin/bash
high=55
critical=75
((hcount=ccount=0))
sns=`sensors`
for f in `echo "$sns" | sed -nr 's/(Core[^+]*[+])([0-9][0-9])(.*)/\2/p'`
do
if ((f>high))
then
((hcount++))
fi
if ((f>critical))
then
((ccount++))
fi
done
if ((ccount>0))
then
poweroff
fi
high=55
critical=75
((hcount=ccount=0))
sns=`sensors`
for f in `echo "$sns" | sed -nr 's/(Core[^+]*[+])([0-9][0-9])(.*)/\2/p'`
do
if ((f>high))
then
((hcount++))
fi
if ((f>critical))
then
((ccount++))
fi
done
if ((ccount>0))
then
poweroff
fi
Далее в /etc/crontab добавляем строку
- Код: Выделить всё
* * * * * root /opt/sns/sns.sh
Теперь скрипт будет запускаться раз в минуту, мониторить температуру и штатно отключать сервер при перегреве.
Все. Спокойно ждем формажора, страховка куплена