我有一个脚本,我想在我的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
答案 0 :(得分: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