Мониторинг файловой системы с помощью файла конфигурации

Я пытаюсь контролировать пространство файловой системы с помощью сценария оболочки. Этот сценарий должен ссылаться на файл конфигурации, который имеет ограничение на статус предупреждения. Конфигурационный файл выглядит следующим образом

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

Но он не работает. Как я могу добиться этого?

0
18.03.2016, 00:53
1 ответ

Ошибка заключается в том, что вы пытаетесь выбрать поля, например,

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% \%} ; это шесть против полдюжины.

2
28.01.2020, 02:35

Теги

Похожие вопросы