Linux 脚本不';它不会执行,而是挂起

Linux 脚本不';它不会执行,而是挂起,linux,bash,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)

我有一个脚本,我想在我的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
#/bin/bash
LOG=/home/user/Scripts/test.txt
服务器=/home/user/Scripts/local/case.txt
案例=$(头-n 1$服务器)
grep INFO:| grep内存$LOG | awk'{print$9}'| tail-n3 |读取输出时;
做
#echo$输出
新=$(echo$输出)
usep=$(echo$output | awk'{print$1}'| cut-d''''-f1)
mag=$(echo$output | awk'{print$2}')
如果[$new-lt 10];然后
echo$new

邮件-s“测试”-警报:内存使用率为$usep%“”user@examplecom“第一个
grep
正在读取标准输入。除非您通过重定向调用它(请告诉我们!),这就是它看起来挂起的原因——它正在等待您键入一些输入

作为一个快速解决方案,改变

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

grep INFO: "$LOG" | grep Memory | awk ...
(这里严格来说,双引号不是必需的,但对于将来的学习来说是个好主意。)

更好的是,将多个
grep
s和
tail
重构为
awk
脚本:

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

END{for(j=1;j第一个
grep
正在读取标准输入。除非您通过重定向调用它(请告诉我们!),这就是它看起来挂起的原因--它正在等待您键入一些输入

作为一个快速解决方案,改变

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

grep INFO: "$LOG" | grep Memory | awk ...
(这里严格来说,双引号不是必需的,但对于将来的学习来说是个好主意。)

更好的是,将多个
grep
s和
tail
重构为
awk
脚本:

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

结束{for(j=1;jc你能在shell中运行邮件行吗?在
#下添加
set-x
是什么?/bin/bash
行,然后从命令行运行脚本以查看发生了什么。请给你的问题提供一个更好的标题。很抱歉,问题标题你能在shell中运行邮件行吗?什么是
添加
set-x
就在
#!/bin/bash
行下方,从命令行运行脚本以查看发生了什么。请为您的问题提供一个更好的标题。对于问题标题,很抱歉,您应该将$LOG移动到第一个grep。啊,谢谢-是的,grep正在等待输入-谢谢,您应该将$LOG移动到第一个grep。啊,谢谢-是的是grep在等待输入-谢谢