需要整数表达式[bash不理解。]
我制作了一个小脚本,如果PID超过预期的cpu使用率,就杀死它。这是可行的,但有一个小问题 脚本:需要整数表达式[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
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