Наверное, все встречались, когда на том или ином разделе жесткого диска места уже нет. А
иногда и просто забываешь проконтролировать место на диске.
Данный скрипт написан по принципу настроил и забыл.#!/bin/sh
address="root@localhost";
cicl="2 3 4 5 6";
# выставляем в процентах порог заполненного места для каждого раздела,
# при котором отсылается сообщение
predel[2]=80; # /
predel[3]=80; # /usr
predel[4]=60; # /var
predel[5]=80; # /tmp
predel[6]=80; # /home
varning="0";count=0;
df -h > /tmp/tmp_df;
while read -r FS S Ud A U MO; do
let count+=1;
FileSystem[$count]=$FS;
Size[$count]=$S;
Used[$count]=$Ud;
Avail[$count]=$A;
Use[$count]=$U;
MountedOn[$count]=$MO;
NUse[$count]=${Use[$count]%"%"};
done < /tmp/tmp_df;
table="";
for c in $cicl; do
if [[ ${NUse[$c]} -ge ${predel[c]} ]]; then
varning="1";
table=$table"\n${FileSystem[$c]} \t${Size[$c]} \t${Used[$c]} \t${Avail[$c]} \t${Use[$c]} \t${MountedOn[$c]}";
fi
done
shapka="\nFileSystem \tSize \tUsed \tAvail \tUse \tMounted On";
body="Regard admin, please check, place on disk:"$shapka$table;
#echo -e $body;
if [ $varning -eq "1" ];
then
echo -e $body | mail -s"Warning on server" $address;
logger -i -p cron.warn -t dfmonitor "Send warning to $address";
else
logger -i -p cron.info -t dfmonitor " Place on disk in rate";
fi
P.S. записать в cron строчку:20 5 * * * /sbin/dfmonitor,
с утра приходим и получаем отчет :-)
URL:
Обсуждается: http://www.opennet.me/tips/info/1405.shtml
-> munin
нарисует красивый график и при превышении критического порога уведомит нужные лица. немедленно./usr/ports/sysutils/munin*
http://munin.projects.linpro.no/
я себе подобное на перл написал, так же, настроил и забыл =) но уже несколько раз выручало
есть еще monit - прямо сейчас удаляет старые файлы на моем ftp, освобождая место под новые. с отчетом на мыло.
тож пользую monit, можешь показать пример для файлов если не трудно.
man periodic.conf
Пример рисования графика для одного раздела:disk_usage_create_ad0s1f.sh
#!/usr/local/bin/bash
PATH=/bin:/usr/bin:/usr/local/bin
DATABASE_DIRECTORY=/usr/local/rrdrrdtool create $DATABASE_DIRECTORY/disk_usage_ad0s1f.rrd -s 60 \
DS:used:GAUGE:600:0:U \
DS:avail:GAUGE:600:0:U \
RRA:AVERAGE:0.5:1:483840 \
RRA:MIN:0.5:1440:1 \
RRA:MAX:0.5:1440:1 \
RRA:MIN:0.5:10080:1 \
RRA:MAX:0.5:10080:1 \
RRA:MIN:0.5:40320:1 \
RRA:MAX:0.5:40320:1 \
RRA:MIN:0.5:483840:1 \
RRA:MAX:0.5:483840:1#!/usr/local/bin/bash
PATH=/bin:/usr/bin:/usr/local/bin
DATABASE_DIRECTORY=/usr/local/rrdTIMESTAMP=`date +%s`
# USAGE = space_used:space_available
USAGE=`df -k | grep ad0s1f | awk '{ print $3":"$4 }'`disk_usage_ad0s1f.sh
rrdtool update $DATABASE_DIRECTORY/disk_usage_ad0s1f.rrd $TIMESTAMP:$USAGE
disk_usage_graphs_ad0s1f.sh
#!/usr/local/bin/bash
PATH=/bin:/usr/bin:/usr/local/bin
GRAPHS_DIRECTORY=/var/www/noc/rrd/disk
DATABASE_DIRECTORY=/usr/local/rrd
HOSTNAME=`hostname`RRDB=$DATABASE_DIRECTORY/disk_usage_ad0s1f.rrd
DISKDEV='ad0s1f'NOW=`date +%s`
ONE_HOUR_AGO=$(($NOW-3600))
ONE_DAY_AGO=$(($NOW-86400))
ONE_WEEK_AGO=$(($NOW-604800))
ONE_MONTH_AGO=$(($NOW-2419200))
ONE_YEAR_AGO=$(($NOW-29030400))
TIMESTAMP=" Generated on `date`"function draw_graphic()
{
rrdtool graph $GRAPHS_DIRECTORY/$1 -s $2 -e $3 -a PNG \
-v Gigabytes -t "Disk usage for $4" \
-l 0 -r \
DEF:used=$RRDB:used:AVERAGE CDEF:usedgb=used,1024,* AREA:usedgb#ff0000:"Space used" \
DEF:avail=$RRDB:avail:AVERAGE CDEF:totalgb=avail,1024,* STACK:totalgb#00CC00:"Space free" \
COMMENT:"\n" \
COMMENT:"$5\n"
}draw_graphic 'disk_'$DISKDEV'_day.png' $ONE_DAY_AGO $NOW "$HOSTNAME (last 24 hours)" "$TIMESTAMP"
draw_graphic 'disk_'$DISKDEV'_week.png' $ONE_WEEK_AGO $NOW "$HOSTNAME (last week)" "$TIMESTAMP"
draw_graphic 'disk_'$DISKDEV'_month.png' $ONE_MONTH_AGO $NOW "$HOSTNAME (last month)" "$TIMESTAMP"
draw_graphic 'disk_'$DISKDEV'_year.png' $ONE_YEAR_AGO $NOW "$HOSTNAME (last year)" "$TIMESTAMP"crontab:
* * * * * /usr/local/rrd/disk_usage_ad0s1f.sh > /dev/null 2>&1
*/15 * * * * /usr/local/rrd/disk_usage_graphs_ad0s1f.sh > /dev/null 2>&1
disk_usage_ad0s1f.sh в тексте должно быть перед:#!/usr/local/bin/bash
во втором скрипте (очепятка).
Нафига это всё нужно, если давно уже есть в системе?
А чем logwatch хуже я не понял, такой же отчет каждый день и в процентах и так?
df -h > /tmp/tmp_df;
while read -r FS S Ud A U MO; do
------
done < /tmp/tmp_df;не лучше ли не плодить лишних сущьностей и упростить до:
df -h |
while read -r FS S Ud A U MO; do
------
done
пишешь:
>#!/bin/sh
но на чистом шелле этот скрипт работать не будет!>table="";
можно упростить до
table=
>for c in $cicl; do
кузявее заменить на:
for c in `seq 2 6`; doPS без обид