脚本不会执行,而是挂起

时间:2013-04-08 10:07:34

标签: linux bash

我有一个脚本,我想在我的Web服务器上每分钟运行一次,检查最后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%" "user@examplecom" <<< \
  " \"$CASE \" - Memory usage is currently peaked to \"$mag ($usep%)\" on $(hostname) as   on $(date)"
  echo "email"
  fi
done

1 个答案:

答案 0 :(得分:1)

第一个grep正在读取标准输入。除非你通过重定向调用它(请告诉我们!)这就是为什么它似乎挂起 - 它等着你输入一些输入。

作为快速解决方案,请更改

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

阅读

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

(双引号在这里并不是绝对必要的,但是为了将来学习是一个好主意。)

好多了,将多个greptail重构为awk脚本:

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

如果输出的顺序很重要,你必须多做一点。

此外,new=$outputnew=$(echo $output)更受欢迎,除非您明确要求分词,在这种情况下set -- $output更安全且更惯用。另请参阅http://porkmail.org/era/unix/award.html#echo