需要整数表达式[bash不理解。]

需要整数表达式[bash不理解。],bash,integer,cpu-usage,Bash,Integer,Cpu Usage,我制作了一个小脚本,如果PID超过预期的cpu使用率,就杀死它。这是可行的,但有一个小问题 脚本: while [ 1 ]; do cpuUse=$(ps -eo %cpu | sort -nr | head -1) cpuMax=80 PID=$(ps -eo %cpu,pid | sort -nr | head -1 | cut -c 6-20) if [ $cpuUse -gt $cpuMax ] ; then kill -9 "$PID" echo Kil

我制作了一个小脚本,如果PID超过预期的cpu使用率,就杀死它。这是可行的,但有一个小问题

脚本:

while [ 1 ];
 do
  cpuUse=$(ps -eo %cpu | sort -nr | head -1)
  cpuMax=80
  PID=$(ps -eo %cpu,pid | sort -nr | head -1 | cut -c 6-20)

  if [ $cpuUse -gt $cpuMax ] ; then
   kill -9 "$PID"
   echo Killed PID $PID at the usage of $cpuUse out of $cpuMax

fi
exit 0
sleep 1;
done
如果整数长度为三位数,则该选项有效;如果整数长度降至两位数,则该选项无效,并显示以下内容:

./kill.sh:第7行:[:51.3:应为整数表达式


我这里的问题是,如何让bash理解分隔符,以便它可以终止三位数以下的进程。

您可能会在该变量中获得前导空格。请尝试使用tr管道,首先剥离所有空格:

cpuUse=$(ps -eo %cpu | sort -nr | head -1 | tr -d '[[:space:]]')
cpuUse
变量:

cpuUse="${cpuUse%%.*}"
在以下情况下,最好使用引号:

if [ "$cpuUse" -gt "$cpuMax" ] ; then
或者最好使用算术运算符
((and))


如您所见,bash不会计算非整数。在进行比较之前,您需要从
$cpuUse
中删除小数点和以下数字:

使用
=”
将消除标题,并简单地为您提供CPU和PID

查看您的程序,实际上不需要排序。您只需查找高于
$cpuMax
阈值的所有进程:

ps -eo %cpu="",pid="" | awk '$1 > 80 {print $2}'
这会打印出超出阈值的PID。
Awk
会自动逐行循环整个输入。Awk还会自动将每行划分为列,并为每行分配一个
$1
及以上的变量。您可以使用
-F
参数更改字段分隔符

上面的
awk
表示查找第一列超过80%(CPU使用率)的所有行,并打印出第二列(pid)

如果您需要一些灵活性并能够传入不同的
$cpuMax
,可以使用
-v
参数设置Awk变量:

ps -eo %cpu="",pid="" | awk -vcpuMax=$cpuMax '$1 > cpuMax {print $2}'
现在,您可以通过管道将此命令的输出传输到一段时间,以删除所有这些进程:

pid=$(ps -eo %cpu="",pid="" | awk -vcpuMax=$cpuMax '$1 > cpuMax {print $2}')
if [[ -n $pid ]]
then
    kill -9 $pid
    echo "Killed the following processes:" $pid
fi

现在它返回:./kill.sh:第7行:(:57.2>100:语法错误:无效的算术运算符(错误标记为“.2>100”)您是否先使用tr去掉空格?If
((and))
不可用,请使用第一个选项。是的,我使用了,但不是空格造成的,而是数字之间的点,因为bash不理解它们,也不知道如何比较。bash算法不支持浮点数学。您需要使用
cpuUse=”将
57.2
转换为
57
${cpuUse%%.*}“
ps -eo %cpu="",pid="" | awk '$1 > 80 {print $2}'
ps -eo %cpu="",pid="" | awk -vcpuMax=$cpuMax '$1 > cpuMax {print $2}'
pid=$(ps -eo %cpu="",pid="" | awk -vcpuMax=$cpuMax '$1 > cpuMax {print $2}')
if [[ -n $pid ]]
then
    kill -9 $pid
    echo "Killed the following processes:" $pid
fi