Script de shell para enviar um email de alerta se o uso do disco exceder 90%

11

Quero implementar um script no meu servidor que envie automaticamente alertas por email se o uso do disco ultrapassar 90% e o segundo alerta por email quando ultrapassar 95%. Meu sistema de arquivos é abc:/xyz/abce o ponto de montagem é /pqr.

Eu tentei isso:

ADMIN="[email protected]" 
ALERT=90 
df -H | grep -vE 'abc:/xyz/pqr | tmpfs |cdrom' | awk '{ print $5 " " $1 }' | while read output; do 
  usep=$(echo $output | awk '{ print $1}' | cut -d'%' -f1 ) 
  partition=$(echo $output | awk '{ print $2 }' ) 
    if [ $usep -ge $ALERT ]; then 
      mail -s "Alert: Almost out of disk space $usep" $ADMIN 
    fi 
  done

Mas estou recebendo um erro que diz

line 7: [: Use: integer expression expected 
Rui F Ribeiro
fonte

Respostas:

13

O erro ocorre devido a um dos argumentos -genão ser numérico. Como $ALERTé sempre numérico, $usepdeve ser o culpado. Existem vários problemas na maneira como você analisa a saída dhcujo resultado é $usepnão ser numérico.

Dependendo dos comprimentos dos sistemas de arquivos, dhpode dividir sua saída em várias linhas. Linhas parciais serão capturadas no seu filtro e resultarão em dados sem sentido. Para evitar esse comportamento e obter saída analisável dh, passe a -Popção

Também dfimprime uma linha de cabeçalho que novamente resultará em dados sem sentido.

Seu filtro é bastante complexo. Eu usaria uma única passagem do awk. Nesse caso, você poderia filtrar a porcentagem dentro do awk (mas eu não fiz isso no script a seguir).

df -H | awk '
    NR == 1 {next}
    $1 == "abc:/xyz/pqr" {next}
    $1 == "tmpfs" {next}
    $1 == "/dev/cdrom" {next}
    1 {sub(/%/,"",$5); print $1, $5}
' | while read filesystem percentage; do
    if [ "$percentage" -ge "$ALERT" ]; then 
      mail -s "Alert: Almost out of disk space ($usep%) on $filesystem" "$ADMIN"
    fi 
  done

NR==1corresponde à primeira linha, então NR==1 {next}pula a primeira linha. As próximas linhas excluem alguns sistemas de arquivos (observe que sua descrição diz que você está interessado abc:/xyz/pqr, mas seu código o exclui). A última linha awk remove a %coluna da porcentagem antes de imprimi-la.

Seria melhor enviar um único e-mail sobre todos os sistemas de arquivos. Desta vez, estou fazendo todas as análises no awk.

message=$(df -h | awk -v ALERT="$ALERT" '
    NR == 1 {next}
    $1 == "abc:/xyz/pqr" {next}
    $1 == "tmpfs" {next}
    $1 == "/dev/cdrom" {next}
    1 {sub(/%/,"",$5)}
    $5 >= ALERT {printf "%s is almost full: %d%%\n", $1, $5}
')
if [ -n "$message" ]; then
  echo "$message" | mail -s "Alert: Almost out of disk space" "$ADMIN"
fi 
Gilles 'SO- parar de ser mau'
fonte
6

Se você alterar print para printf usando% d, a porcentagem se tornará um número inteiro. Experimentar:

printf("%d", $5);

que converterá 91% em 91. Portanto, o comando final é este:

df -H | grep /dev/xvde1 | awk '{ printf "%d", $5}'

O comando acima em inglês: "Obtenha o uso do espaço em disco em formato legível por humanos. Filtre com grep o disco que queremos examinar. Canalize essa linha para ativar e imprima a 5ª palavra delimitada por espaço (vazios removidos) e formate a sequência resultante como um número inteiro.Para mim, o comando retorna o número inteiro, o 78que significa que o disco está 78% cheio.

SeanO
fonte
3
$ df | tail +2 | sed s/%//g | awk '{ if($5 > 90) print "Alert "$0;}'
  • df | tail +2 pega toda a saída depois de pular as 2 primeiras linhas
  • sed s/%//g tiras sinais de porcentagem
  • awk ... imprime "Alerta ..." se o quinto campo na saída for um número maior que 90
Ashis Lenka
fonte
1
Bem-vindo ao Stack Exchange! Estamos procurando respostas longas que forneçam alguma explicação e contexto. Não basta dar uma resposta em uma linha; explique como isso funciona. As respostas que não incluem explicações podem ser removidas.
G-Man diz 'Reinstate Monica'
0

aqui está minha variante:

#!/bin/bash

ADMIN=yermail@yerdom.com
ALERT=90
df -H | grep -vE 'abc:/xyz/pqr | tmpfs |cdrom|Used' | awk '{ print $5 " " $1 }' | while read output; do 
usep=$(echo $output | awk '{ print $1}' | cut -d'%' -f1 ) 
echo $usep
partition=$(echo $output | awk '{ print $2 }' ) 
if [ $usep -ge $ALERT ]; then 
  echo  "Alert: Almost out of disk space $usep" 
  df -H | mail -s "Alert: out of disk space $usep"  $ADMIN
fi 
done
fyg
fonte
0

Não consigo comentar a resposta de Gilles acima, mas esteja ciente de que o awk está fazendo uma comparação baseada em string na segunda parte, em que:

$5 >= ALERT

Percebi isso quando estava testando limites de um dígito. Você pode forçar uma conversão a int usando +0, para que a comparação se torne:

$5+0 >= ALERT
kmac
fonte