2013-04-08 2 views
1

У меня есть сценарий, который я хочу запускать каждую минуту на своем веб-сервере, чтобы проверить последние 3 строки файла журнала, чтобы узнать, какое использование памяти для программы. Скрипт работает так же, как и получает правильный результат для памяти, но я не могу получить его по электронной почте или выходить - он просто зависает?Сценарий не выполняется, скорее он висит

Любые идеи о том, почему это не выходит? И это лучший подход для запуска в качестве cron на сервере, чтобы загладить последние 3 строки журнала?

#!/bin/bash 
LOG=/home/user/Scripts/test.txt 
SERVER=/home/user/Scripts/local/case.txt 
CASE=$(head -n 1 $SERVER) 

grep INFO: | grep Memory $LOG | awk '{print $9}' | tail -n 3 | while read output; 
do 
    #echo $output 
    new=$(echo $output) 
    usep=$(echo $output | awk '{ print $1}' | cut -d'%' -f1 ) 
    mag=$(echo $output | awk '{ print $2 }') 
    if [ $new -lt 10 ]; then 
    echo $new 
    mail -s "TEST" - Alert: Memory usage is at $usep%" "[email protected]" <<< \ 
    " \"$CASE \" - Memory usage is currently peaked to \"$mag ($usep%)\" on $(hostname) as on $(date)" 
    echo "email" 
    fi 
done 
+0

Можете ли вы запустить почтовую линию в оболочке? Что делает '<<<' там? – choroba

+0

добавьте 'set -x' чуть ниже строки' #!/Bin/bash' и запустите сценарий из командной строки, чтобы узнать, что происходит. И PLS PLS дать лучшее название на ваш вопрос. – anubhava

+0

Извините, что вы задали вопрос – Grimlockz

ответ

1

Первый grep читает стандартный ввод. Если вы не вызвали это с перенаправлением (пожалуйста, покажите нам!), Поэтому он, кажется, зависает - он ждет ввода типа ввода.

Как быстро исправить, изменить

grep INFO: | grep Memory $LOG | awk ... 

читать

grep INFO: "$LOG" | grep Memory | awk ... 

(двойные кавычки не являются строго необходимыми здесь, но хорошая идея, чтобы узнать о будущем.)

Гораздо лучше, реорганизовать несколько grep и tail в awk сценарий:

awk '/INFO:/ && /Memory/ { g[NR%3+1] = $0 } 
    END { for (j=1; j<=3; ++j) print g[j] }' "$LOG" 

Если порядок вывода значителен, вам придется немного поиграть с ним.

Кроме того, new=$output намного предпочтительнее более new=$(echo $output), если вы специально не требуется разбиение слов, в этом случае set -- $output одновременно является более безопасным и более идиоматических. См. Также http://porkmail.org/era/unix/award.html#echo

+0

Да, вы должны перенести $ LOG на первый grep. –

+0

Ahh спасибо - да, это был grep, ожидающий ввода - спасибо – Grimlockz

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