Даниил Подрабинек (grohman) wrote in ru_shell,
Даниил Подрабинек
grohman
ru_shell

Мониторинг hdd

 Захотелось красивого мониторинга за температурой и нагрузкой hdd на домашнем хосте. Короче говоря, кое-как получилось. Для работы нам потребуются 
hddtemp, iotop, libnotify
 
Вот сам bash-скрипт:
 
#!/bin/bash
panic=false;
# Здесь пишем максимальную температуру.
term=64;
# Подключим виртульную ФС, заняв немного ram. Туда будут складываться логи.
tmpfs=/var/log/tmpfs;
tmpfsize=512;
mkdir -p ${tmpfs};
if [ "`mount|grep ${tmpfs}`" = '' ]; then
        mount none ${tmpfs} -t tmpfs -o nr_inodes=2,size=${tmpfsize}K
        touch ${tmpfs}/hdd.log;
fi
#Здесь мы определяем кто последний залогинился в иксы, ему скрипт и будет высылать уведомления.
#display=`w|grep xdm| awk {'print $2'}|tail -n 1`;
#user=`w|grep xdm|awk {'print $1'}|tail -n 1`;
display=:`ls -1 /tmp/.X11-unix/| sed s/X//| tail -n 1`;
user=`w| grep "${display} "|awk {'print $1'}`;
 
export DISPLAY=${display};
 
#Если никто не залогинен, выходим. Вообще, можно и не выходить, а высылать алерты на емейл. Но зачем повторять функционал nagios :)
if [ $user = '' ]; then exit 0; fi

# если в ${tmpfs} кончилось место, делаем все что можем чтобы донести это до тебя
if [ "`du ${tmpfs}/hdd.log|awk {'print $1'}`" = ${tmpfsize} ]; then
        nospace=true;
        in=0; 
while [ ${in} != "10" ]; do
su ${user} -c "notify-send -u  critical 'В ${tmpfs} кончилось место. Возможно, это случилось по причине сильного перегрева одного из дисков. Пора что-то делать!!! Можешь почистить логи, но разобраться с хардом придется!'";
                in=`expr ${in} + 1`;
                sleep 10;
        done
else
        nospace=false;
fi
 
 
# три моих диска - sda, sdb и sdc
        for drive in sda sdb sdc; do
#                temp=`hddtemp /dev/sd${drive}| awk {'print $3'}| sed s/"°C"//`;
                temp=`hddtemp -n /dev/${drive}`;
                if [ ${temp} -ge ${term} ]; then
                        su ${user} -c "notify-send -u critical 'ВНИМАНИЕ! Температура жесткого диска /dev/${drive} поднялась до $temp°C'";
                        if [ "${nospace}" = 'false' ]; then
                                echo "$temp°C on /dev/$drive at `date +%d.%m.%Y-%H:%M`" >> ${tmpfs}/hdd.log
                        fi
                        panic=true;
                fi
        done
 
if [ "${panic}" = 'true' ]; then
#        su ${user} -c "notify-send -u critical 'Вот три топовых процесса: `iotop -b -n 1 > /tmp/iotop && echo && head -n 5 /tmp/iotop| tail -n 3| awk {'print $11" (pid:"$1")"'} && rm -f /tmp/iotop`'";
          su ${user} -c "notify-send -u critical 'Вот три топовых процесса: `iotop -b -n 1 2>/dev/null|head -n 5| tail -n 3| awk {'print $11" (pid:"$1")"'}`'";
 
fi
 
Поставил выполняться кроном от имени root раз в пять минут. Результат можете увидеть на скриншоте.
 
 



 
Кончено, вместо libnotify можно использовать mail, это всё довольно просто. Однако,
мне не очень понятно как бы выдергивать строки из iotop без использования файлов. Пробовал по-всякому, фигня получается. Помогите, пожалуйста, с ним разобраться.
update: вроде все сделано :) Спасибо 1_ananas_1 за участие.
update1: теперь захотелось вести логи. Но поскольку писать логи про хдд на хдд мне показалось не очень уместным, я решил писать их в оперативную память. А точнее, в tmpfs. Храниться они там будут, само собой, только до размонтирования ${tmpfs}.
Tags: bash, hdd, x11
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

  • 7 comments