2009-11-24 5 views
4

Следующие сумы оболочки будут проверять дисковое пространство и изменить переменную diskfull, чтобы 1 если использование более чем на 10% Последнего эха всегда показывает 0 Я попробовал global diskfull=1 в если п но не работал. Как изменить переменную на 1, если потребляемый диск составляет более 10%?объем переменных в трубе

#!/bin/sh 
diskfull=0 

ALERT=10 
df -HP | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{ print $5 " " $1 }' | while read output; 
do 
    #echo $output 
    usep=$(echo $output | awk '{ print $1}' | cut -d'%' -f1 ) 
    partition=$(echo $output | awk '{ print $2 }') 
    if [ $usep -ge $ALERT ]; then 
    diskfull=1 
    exit 
    fi 
done 

echo $diskfull 
+0

Вы уверены, что тело оператора if выполняется? Более вероятно, что if оценивает значение false, а строка diskfull = 1 никогда не выполняется. – asm

+0

Спасибо за все ответы.То, что я сделал, это то, что я вышел из предложения if с условием выхода 1, а затем сохранил его для переменной diskfull сразу после «done». Кажется, что это обходное решение работает. – shantanuo

ответ

1

При использовании труб швы оболочки используют подрамники для выполнения работ. Поскольку $diskfull не известен этим суб-оболочкам, значение никогда не изменяется.

См: http://www.nucleardonkey.net/blog/2007/08/variable_scope_in_bash.html

Я изменил свой сценарий следующим образом. Он работает для меня и должен работать и на вашей системе.

#!/bin/sh 
diskfull=0 

ALERT=10 
stats=`df -HP | grep -vE '^Filesystem|tmpfs|cdrom|none|udev' | awk '{ print $5 "_" $1 }'` 
for output in $stats 
do 
    usep=$(echo $output | awk '{ print $1}' | cut -d'%' -f1 ) 
    partition=$(echo $output | sed s/.*_//) 
    #echo $partition - $usep 
    if [ $usep -le $ALERT ]; then 
    diskfull=1 
    break 
    fi 
done 
echo $diskfull 
0

Я думаю, вы не должны получать к diskfull=1 линии, потому что если бы вы были, вы не получите никакого вывода на all-- следующей строки exit бы выйти из сценария.

Я не знаю, почему это не работает, но обратите внимание, что AWK может обрабатывать остальную часть работы:

diskfull=$(df -HP | grep -vE '^Filesystem|tmpfs|cdrom' | awk 'BEGIN { x = 0 } { if ($5 + 0 >= '$ALERT') { x = 1 } } END { print x }') 

Таким образом, вам не нужно время цикла.

0

Вы можете сделать это с помощью gawk (не нужно использовать grep). для оповещений вы можете отправлять электронную почту root.

threshold=10 
df -HP | awk -v t="$threshold" -v msg="" 'NR>1 && $5+0 > t{ 
    msg=msg $1" is "$5"\n" 
}END{print msg}' | mail root 

или проверить, есть ли "сообщение" или не первый

threshold=10 
result=$(df -HP | awk -v t="$threshold" -v msg="" 'NR>1 && $5+0 > t{ 
    msg=msg $1" is "$5"\n" 
}END{print msg}') 
if [ -n "$result" ];then 
    echo "Overload" 
    echo "$result" | mail root 

fi 
0

В этой строке:

usep=$(echo $output | awk '{ print $1}' | cut -d'%' -f1 ) 

это не обязательно использовать cut. Вы можете сделать это:

usep=$(echo $output | awk -F% '{ print $1}') 
+0

с помощью gawk вы можете использовать $ 5 + 0, чтобы изменить поле на целое. % «Автоматически ушел». (из-за отсутствия лучшего слова) – ghostdog74

1

@OP, используйте внешние подпорки или()

count=0 
max=10 
diskfull=0 
df -HP | { while read disk b c d used e 
do  
    if [ "$count" -gt 1 ];then 
     used=${used%?} 
     if [ "$used" -gt "$max" ];then 
      echo "overload: $disk, used: $used%" 
      diskfull=1 
     fi 
    fi 
    count=$((count+1)) 
done 
echo "diskfull: $diskfull" 
} 
5

Это побочный эффект от использования while в трубопроводе. Есть два способа решения:

1) поставить цикл while и все переменные, которые он использует в отдельном объеме, как продемонстрировано levislevis86

some | complicated | pipeline | { 
    while read line; do 
     foo=$(some calculation) 
    done 
    do_something_with $foo 
} 
# $foo not available here 

2), если ваша оболочка позволяет, использовать замену процесса и вы можете перенаправить вывод вашего конвейера на вход цикла while

while read line; do 
    foo=$(some calculation)} 
done < <(some | complicated | pipeline) 
do_something_with $foo 
+0

Вы можете попробовать ['set + o posix'] (http://www.linuxjournal.com/content/shell-process-redirection) до 2). Также смотрите [здесь] (http://tldp.org/LDP/abs/html/process-sub.html). – sjngm

Смежные вопросы