【问题标题】:Using LINUX top command to compute used memory percentage使用 LINUX top 命令计算已用内存百分比
【发布时间】:2012-08-20 13:42:00
【问题描述】:

我正在将顶部命令输出写入文本文件。 我正在尝试编写一个简单的 bash 脚本来计算已用内存的百分比并发送 如果内存使用百分比超过 90%,则发送电子邮件。

这是我目前拥有的 bash 脚本。

#!/bin/bash
top -n 1 -b | grep "Mem" > /home/modadm/top-output.txt
MAXMEM=/home/modadm/top-output.txt | grep "Mem" | cut -c 7-14 
USEDMEM=/home/modadm/top-output.txt | grep "Mem" | cut -c 25-31
$USEDPCT='echo $USEDMEM / $MAXMEM * 100 | bc'
$USEDPCT | mail -s "Test Email from MOD Server" test@test.com

当我保存并执行脚本时,我收到错误“没有这样的文件或目录”:

-bash-3.2$ ./memcheck.sh
./memcheck.sh: line 4: =echo $USEDMEM / $MAXMEM * 100 | bc: No such file or directory
Null message body; hope that's ok
-bash-3.2$ 

有人可以帮忙吗?我是 bash 脚本的新手,这是我的第一个脚本。

谢谢

【问题讨论】:

    标签: linux bash


    【解决方案1】:

    其他答案的内容我不再赘述;相反,我会质疑解析top 的输出是否明智,因为您只需要有关系统内存使用情况的信息。

    top 的输出是供人类使用的,并且还包含大量不需要且生产成本高的每个进程的信息。 free 的输出更适合这种特殊用途。

    其次,从脚本中的计算来看,您似乎不了解在 Linux 和其他类 Unix 系统上测量系统内存使用的方式。与 other 操作系统相反,使用的内存大小包含用于磁盘缓存和其他缓冲区的内存。在任何已启动一段时间的系统上,可用内存趋向于零 - 未使用的内存是浪费的内存。

    找出进程使用的内存量的第一步是从已用内存大小中减去用于缓冲区的内存量。但即使这样在现代系统上也是不够的——即使freetop 在一定程度上都会出错,正如this older answer of mine 中提到的那样。

    【讨论】:

    • thkala:非常感谢您的建议。将尝试使用 free 命令而不是 top。其他人发布的代码更正让我有机会第一次尝试 bash shell 脚本。再次感谢。
    【解决方案2】:

    这里有一些问题。

    首先,这并没有做你想做的事情。

    USEDMEM=/home/modadm/top-output.txt | grep "Mem" | cut -c 25-31
    

    您不能将文件名通过管道传输到命令中。您实际上希望将文件的内容通过管道传输到命令中。你可以用“猫”来做到这一点。但是,grep 实际上是为在文件中搜索而设计的,因此您可以这样做

    USEDMEM=$(grep "Mem" /home/modadm/top-output.txt | cut -c 25-31)
    

    请注意,$(cmd) 是您在子 shell 中执行命令的方式。即,您可以运行一些命令来计算脚本中变量的值。您也可以使用 `cmd`(反引号;通常在波浪号键上),但语法不太清楚。

    同样,您可能希望在子shell 中计算此结果。另外,分配给变量时不要使用 $。

    $USEDPCT='echo $USEDMEM / $MAXMEM * 100 | bc'
    

    这可以改写为

    USEDPCT=$(echo "scale=3; $USEDMEM / $MAXMEM * 100" | bc)
    

    最后,您希望将变量的内容通过管道传送到邮件程序中。管道期望程序位于左侧。您可以通过将变量的值回显到管道中来做到这一点。

    echo "$USEDPCT" | mail -s "Test Email from MOD Server" test@test.com
    

    将所有内容重新组合在一起:

    #!/bin/bash
    top -n 1 -b | grep "Mem" > /home/modadm/top-output.txt
    MAXMEM=$(grep "Mem" /home/modadm/top-output.txt | cut -c 7-14)
    USEDMEM=$(grep "Mem" /home/modadm/top-output.txt | cut -c 25-31)
    USEDPCT=$(echo "$USEDMEM / $MAXMEM * 100" | bc -l)
    echo "$USEDPCT" | mail -s "Test Email from MOD Server" test@test.com
    

    【讨论】:

    • 太棒了!克里斯,非常感谢你为我逐行解释我哪里出错了!!。再次感谢。
    • 我修改最后一行将百分比四舍五入为:USEDPCTSRND=$(echo "scale=4; $USEDPCT" | bc) USEDPCTS="当前使用的MOD服务器内存为:"$USEDPCTSRND" %" 回声 "$USEDPCTS" |公元前 | mail -s "MOD Server:Memory Usage" test@test.com 但是四舍五入不行!你能帮忙吗?谢谢。
    • @user765081 我更新了答案以完成百分比计算。祝你好运
    • 在这个问题下的最后一件事,我试图在文本和百分比值之间添加一个回车:我将最后两行修改为: USEDPCTS="Current used DOM server memory is " $ '2 \n' $USEDPCT " %",最后一行为 echo -e "$USEDPCTS" | mail -s "DOM 服务器内存使用情况" test@test.com 但是我得到一个错误。请不要介意。你能帮我吗?谢谢
    【解决方案3】:

    其他人指出了您的代码存在问题,但对此有更简单的选择,即根本不解析 top 输出。使用/proc/meminfoawk - 您不需要临时文件。

    $ awk '/MemTotal:/{total=$2} \
           /MemFree:/{free=$2} \
           END{ \
            print "Free mem percent: "(free*100/total); \
            print "Used mem percent: "((total-free)*100/total) \
           }' /proc/meminfo 
    
    Free mem percent: 87.7348
    Used mem percent: 12.2652
    

    通过管道将其发送到 mail 或任何您想要的。

    【讨论】:

      【解决方案4】:

      试试下面的脚本。

      #! /bin/bash
      
      memusage=`top -n 1 -b | grep "Mem"`
      MAXMEM=`echo $memusage | cut -d" " -f2 | awk '{print substr($0,1,length($0)-1)}'`
      USEDMEM=`echo $memusage | cut -d" " -f4 | awk '{print substr($0,1,length($0)-1)}'`
      
      USEDMEM1=`expr $USEDMEM \* 100`
      PERCENTAGE=`expr $USEDMEM1 / $MAXMEM`%
      
      echo $PERCENTAGE | mail -s "Test Email" test@test.com
      

      【讨论】:

        【解决方案5】:

        我已更正您的语法错误。 PL。注意命令替换的使用, 就像你写的那样

        MAXMEM=/home/modadm/top-output.txt | grep "Mem" | cut -c 7-14.
        

        这是错误的,你需要写

         grep "Mem" /home/modadm/top-output.txt | cut -c 7-14
        

        然后将其括在反引号中(左侧的键位于制表键上方)以将最终值分配给变量。 你也写过,

        $USEDPCT='echo $USEDMEM / $MAXMEM * 100 | bc'
        

        美元符号使用错误。 $ 应该在您使用的值时使用 一个变量。引号应该是`(反引号)而不是'(单引号)。反引号表示命令将被命令的输出替换。 同样对于浮点 bc 需要设置一个比例。

        Pl。查看修改后的代码。希望这可以帮助。 PL。注意我没有检查邮件命令的功能是否发送邮件。

        top -n 1 -b | grep "Mem" > /home/modadm/top-output.txt
        MAXMEM=`grep "Mem" /home/modadm/top-output.txt | cut -c 7-14`
        USEDMEM=`grep "Mem" /home/modadm/top-output.txt | cut -c 25-31`
        USEDPCT=`echo   "scale=2; $USEDMEM / $MAXMEM * 100" | bc `
        echo $USEDPCT | mail -s "Test Email from MOD Server" test@test.com
        

        【讨论】:

          猜你喜欢
          • 2010-12-09
          • 2012-05-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-07
          • 1970-01-01
          相关资源
          最近更新 更多