BASH 脚本中出现错误“需要整数表达式”

BASH 脚本中出现错误“需要整数表达式”

脚本

#!/bin/bash
MEM=`ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | grep -i 4721 | grep -v "grep" | awk '{print $4}'`
PID=4721
while true;
do
if [ $MEM -gt 94 ]; then
printf "mem has exceeded, kill it"
kill -9 $PID
echo "Killed the process"
        exit 0
    else
        echo "SIZE has not yet exceeding"
    fi

    sleep 10
done

输出

[root@ris-n-v10253 ~]# sh ash.sh
ash.sh: line 6: [: 1.3: integer expression expected
SIZE has not yet exceeding

跑步ps...

ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | grep -i 4721 | grep -v "grep" | awk '{print $4}'

1.3

答案1

Shell 不喜欢非整数(ksh 除外)。

简单的解决方案是让 awk 将 %age 输出到最接近的整数。替换所有这些:

grep -i 4721 | grep -v "grep" | awk '{print $4}'

有了这个:

awk -v Pid="${PID}" '$1 == Pid { printf ("%d\n", int (0.5 + $4))' }

还有许多其他可能的改进:

使脚本可执行,并将其作为命令运行而不指定 sh。

您初始化 PID 变量,但在上一个命令中硬编码相同的值。

您对 ps 输出进​​行排序,但无论如何还是挑选出一行。

如果 ps 的 cmd 字段有任何空格,则 %mem 字段将不再位于 $4 中。事实上,为什么输出 ppid、cmd、%cpu ——你没有使用它们中的任何一个?

您每 10 秒就永远地循环一次,以检查 MEM 的值。但是你只在循环之前初始化它一次,所以它永远不会再改变。

做更多报告可能会有所帮助:

为了保持一致性,选择 printf 或 echo。

打印哪个进程(名称和 pid)正在被终止,以及由哪个脚本终止。也许甚至是它发生的时间,以及它已经运行了多长时间。

有助于报告发现的实际百分比,而不仅仅是它没有失败。这将有助于监测增长。在这种情况下,它还会向您显示它是平坦的。

相关内容