Я пытаюсь контролировать пространство файловой системы с помощью сценария оболочки. Этот сценарий должен ссылаться на файл конфигурации, который имеет ограничение на статус предупреждения. Конфигурационный файл выглядит следующим образом
FileSYSTEM WARNING CRITICAL
/dev/sda5 80 90
/dev/sda3 50 70
/dev/sda2 60 75
/dev/sda1 75 80
tmpfs 70 75
Поэтому всякий раз, когда я запускаю скрипт, он должен сравнивать используемый процент df -Ph с этим конфигурационным файлом и вызывать предупреждение (или критическую почту) соответственно.
Скрипт, который я пробовал, выглядит следующим образом
#!/bin/ksh
HOST=`hostname`
DATE=`date`
LOGDIR=/home/oracle/files/logs
CONFIG_FILE=/home/oracle/files/template
FILESYSTEM=`mount -l | egrep -v 'root'| awk '{print $3}'`
for i in $FILESYSTEM
do
df -Ph $i > ($LOGDIR)\FS.log
sed -e '/Filesystem/d' -e 's/\%/ /g' ${LOGDIR}/FS.log > ${LOGDIR}/FS1.log
SPACEUSED=$(awk '{print $5}' ${LOGDIR}/FS1.log)
while read -r line
do
FS_TEMPLATE=`awk {'print $1'}`
if ($i == $FS_TEMPLATE)
then
WARNING_LIMIT=`awk {'print $3'}`
CRITICAL_LIMIT=`awk {'print $2'}`
if ($SPACEUSED == $CRITICAL_LIMIT)
then
echo ' mail criticality'
elseif ($SPACEUSED -ge $WARNING_LIMIT)
then
echo 'waning'
fi
fi
done < $CONFIG_FILE
done
# Remove temporary work files.
rm -f ${LOGDIR}/FS.log
rm -f ${LOGDIR}/FS1.log
# End of Script
Но он не работает. Как я могу добиться этого?
Ошибка заключается в том, что вы пытаетесь выбрать поля, например,
CRITICAL_LIMIT=`awk {'print $2'}`
без ввода awk
; очевидно, вы хотели echo $ line |
или (в ksh bash zsh) <<< $ line
, и ваш синтаксис if неверен: вам нужно ((
) )
для арифметического сравнения и кое-что еще для сравнения строк и elif
вместо elseif
. Другие вещи более неуклюжие, чем необходимо:
вы изначально исключаете только те файловые системы, строка монтирования которых включает root
. Я хотел бы отслеживать использование пространства в корневой файловой системе. Однако практически все системы сегодня имеют несколько файловых систем, которые не хранятся и поэтому не имеют места для мониторинга: / proc
и / sys
обычно, / dev
или его часть часто, иногда другие. Если вы запустите df
без указания файловой системы, он сделает все значимые файловые системы за вас. Более того, вы заботитесь только о файловых системах, которые находятся в файле конфигурации, так что просто делайте это.
вы читаете
каждую строку и (пытаетесь) неуклюже разбивать ее с помощью awk
, когда читать
можете сделать это бесплатно
вы (попробуйте) проверять, только если использование равно пороговому значению; если например'/ dev / sda5' быстро меняется с 79% до 81%, ваша логика не выдаст предупреждение для 80%. Обычно люди хотят получать предупреждения, когда использование достигает или выше порогового значения.
{
и }
в скрипте awk
следует заключать в кавычки, потому что фигурные скобки являются специальными символами оболочки (по крайней мере, для большинства командных интерпретаторов) и могут дают непредвиденные и нежелательные результаты, хотя и не в ваших конкретных случаях
. И вы вообще не пытались отправить что-либо по почте, но это часто зависит от системы и среды, поэтому я оставлю это вам.
Применяя все то, что я сделал бы:
#!/bin/ksh
CONFIG_FILE=/home/oracle/files/template
<$CONFIG_FILE while read filesys warn crit; do
used=$( df -Ph "$filesys" | awk 'NR>1 {sub(/%/,"",$5);print $5}' )
if (($used >= $crit)); then echo critical $used% on $filesys
elif (($used >= $warn)); then echo warning $used% on $filesys; fi
done
В качестве альтернативы вы можете оставить %
в поле 5 и использовать и проводить сравнения с усеченным значением $ {used% \%}
; это шесть против полдюжины.