Os principais problemas que você tem aqui são
-
fsExcludeé uma matriz, para obter todos os elementos, você precisa de${array[@]}. Em qualquer caso, a opção-xprecisa de tipos de sistemas de arquivos, não de dispositivos. -
Um erro de sintaxe no seu comando
awk, você queriaawk '{print $5}'Sem o
print,awkterá a expressão$5que avalia paratruese existir um campo 5 e, portanto, imprimirá todas as linhas com pelo menos 5 campos. -
Se eu entendi seu objetivo, parece que você deseja comparar a porcentagem atual com o valor de
fsUsed. No entanto, seu comando cria um arquivo chamadofsUsede imprime a saída dedf. O que você queria eraif [ "$(df -x $fsExclude | awk '$5' | sed '2p')" -gt "$fsUsed" ]O
$()é chamado de substituição de comando e é expandido para o saída de qualquer comando que você executou. Isso é o que você quer comparar com o valor defsUsede, para obter esse valor, você precisa do$. -
Você tem
$WarnEMailentre aspas simples, isso significa que está sendo tratado como uma string literal e não como uma variável. Tente isso:mail -s "WARNING: Almost out of disk space %" "$WarnEmail" < dfFile.tmp -
Seu comando
dfretornará várias linhas, mas você está executando uma única comparação, que não funcionará. Você precisará verificar cada linha da saída dedf:
Então, você também está fazendo isso de uma maneira desnecessariamente complexa. Por que não algo assim:
#!/bin/bash
fsExclude="/proc|/dev/floppy|/dev/cdrom" #Exclusions from df file system
fsUsed=15 #percent to watch for
WarnEmail=root #email for warning message
problem=0;
df | grep -v "$fsExclude" |
while read line
do
## Check the percentage, send the mail if at least
## one mount point's percentage is > $fsUsed
if [[ $(grep -oE '[0-9]+%' <<<"$line" | tr -d '%') -gt $fsUsed ]]
then
## I'm not sure if 'command | mail' works and I don't have a system
## I can test it on. If it doesn't, use a file as you did before.
df -h | mail -s "WARNING: Almost out of disk space %" "$WarnEmail"
## No need to rpocess any more lines, exit the while loop
break;
fi
done