脚本
#!/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)正在被终止,以及由哪个脚本终止。也许甚至是它发生的时间,以及它已经运行了多长时间。
有助于报告发现的实际百分比,而不仅仅是它没有失败。这将有助于监测增长。在这种情况下,它还会向您显示它是平坦的。