1

我有一个脚本,我想在我的 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
4

1 回答 1

1

首先grep是读取标准输入。除非您通过重定向调用它(请告诉我们!)这就是它看起来挂起的原因——它正在等待您输入一些输入。

作为快速修复,更改

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

读书

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

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

更好的是,将 multiple greps 和 the重构tailawk脚本中:

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

如果输出的顺序很重要,你必须多摆弄它。

此外,除非您特别需要分词,否则它比它更new=$output可取,在这种情况下更安全且更惯用。另见http://porkmail.org/era/unix/award.html#echonew=$(echo $output)set -- $output

于 2013-04-08T10:27:33.983 回答