Monitoramento FileSystem usando um arquivo de configuração

0

Estou tentando monitorar o espaço do sistema de arquivos usando um script de shell. Esse script deve referenciar um arquivo de configuração que possui restrição de status de alerta. O arquivo de configuração é como abaixo

FileSYSTEM  WARNING     CRITICAL
/dev/sda5   80  90
/dev/sda3   50  70
/dev/sda2   60  75
/dev/sda1   75  80
tmpfs       70  75

Portanto, sempre que eu executo um script, ele deve comparar a porcentagem usada do df -Ph com esse arquivo de configuração e disparar um aviso (ou) de e-mail crítico de acordo.

O script que tentei é o seguinte

#!/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

Mas não está funcionando. Como eu poderia conseguir isso?

    
por sabarish jackson 17.03.2016 / 09:44

1 resposta

2

As falhas são que você tenta selecionar campos com, por exemplo,

CRITICAL_LIMIT='awk {'print $2'}'

sem atribuir awk a nenhuma entrada; você aparentemente queria echo $line| ou (em ksh bash zsh) <<<$line , e sua sintaxe if está errada: você precisa de (( )) para comparação aritmética, e outra coisa inteiramente para comparação de strings, e elif em vez de %código%. Outras coisas são mais desajeitadas do que o necessário:

  • você inicialmente exclui, apenas, qualquer filesysem cuja linha de montagem inclua elseif . Eu gostaria de monitorar o uso do espaço no sistema de arquivos raiz. No entanto, praticamente todos os sistemas de hoje têm vários sistemas de arquivos que não são armazenados e, portanto, não têm espaço para serem monitorados: root e /proc geralmente, /sys ou parte dele frequentemente, às vezes outros. Se você executar /dev sem especificar um sistema de arquivos, ele fará todos os sistemas de arquivos significativos para você. Melhor ainda, você só se importa com os sistemas de arquivos que estão no arquivo de configuração, então faça isso.

  • você df de cada linha e (tente) dividir desajeitadamente com read quando awk puder fazer isso de graça

  • você (tenta) testar apenas se o uso for igual a um limite; se, e. '/ dev / sda5' vai rapidamente de 79% para 81% sua lógica não dará um aviso para 80%. Normalmente, as pessoas querem alertas quando o uso está ou acima de um limite.

  • o script read e { em um } deve ficar entre aspas, porque as chaves são caracteres especiais para o shell (pelo menos a maioria das shells) e podem produzir resultados não intencionais e indesejados, embora não em seus casos específicos

E você ainda não tentou enviar nada por e-mail, mas isso depende do sistema e do ambiente, então deixarei isso para você.

Aplicando todos os que eu faria:

#!/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 

Alternativamente, você pode deixar o awk no campo 5 e usado, e fazer as comparações no valor aparado % ; são seis contra meia dúzia.

    
por 17.03.2016 / 13:56