Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在bash中获取CPU使用率,不使用top或sysstat_Bash_Sed_Cpu Usage - Fatal编程技术网

在bash中获取CPU使用率,不使用top或sysstat

在bash中获取CPU使用率,不使用top或sysstat,bash,sed,cpu-usage,Bash,Sed,Cpu Usage,我的测试脚本如下所示: prev_total_cpu=0 prev_idle_cpu=0 while true do tempenv=$(grep "cpu " /proc/stat) #get cpu times read cpu user nice system idle <<< "$tempenv" #calculate total cpu time let total=$[$user + $nice + $system + $idle] #calcul

我的测试脚本如下所示:

prev_total_cpu=0
prev_idle_cpu=0

while true
do
 tempenv=$(grep "cpu " /proc/stat)
 #get cpu times
 read cpu user nice system idle <<< "$tempenv"

 #calculate total cpu time
 let total=$[$user + $nice + $system + $idle]

 #calculate delta total and delta idle
 prev_total="prev_total_$cpu"
 prev_idle="prev_idle_$cpu"
 let delta_total=$[$total-${!prev_total}]
 let delta_idle=$[$idle-${!prev_idle}]

 #calculate cpu usage
 printf "$cpu: $[100*($delta_total-$delta_idle)/$delta_total]%% "

 #remember total and idle times
 let prev_total_$cpu="$total"
 let prev_idle_$cpu="$idle"

 echo ""
 sleep 1
done
prev\u total\u cpu=0
上一个空闲cpu=0
虽然是真的
做
tempenv=$(grep“cpu”/proc/stat)
#获取cpu时间
读取cpu用户尼斯系统空闲时

grep "cpu" /proc/stat | while IFS='\n' read tempenv
do
    ...
done
while循环在子shell环境中运行

一种解决方案是使用流程替代:

while IFS='\n' read tempenv
do
    ...
done < <(grep "cpu" /proc/stat)
在代码中添加一些建议,在Bash中执行算术运算时,最好使用
(())
格式,例如:

(( total = user + nice + system + idle ))
使用
-n
也可能比使用
printf
更好:

echo -n "$cpu: $(( 100 * ($delta_total - $delta_idle) / $delta_total ))%% "

最后,我希望您的意思是使用
Bash
运行脚本,而不是像
Ksh
这样的shell。他们非常不同。Bash是一个shell,但是
shell!=Bash

出于某种原因,我从来没有得到过
Bash——版本的输出是什么?我使用的是GNU Bash,版本4.1.10(4)-发行版(i686 pc cygwin)。这是一个测试环境,因为我的项目中的所有bash脚本都应该在任何“真正”的Linux发行版上运行。是的,我看到了
let total=$[$user+$nice+$system+$idle]
“total=$user+$nice+$system+$idle”
((let total=$[$user+$nice+$system+$idle))
它们都做相同的事情,但我不知道根本的区别是什么(因为它们都产生了一个子壳)
(())
不会调用子壳。我想你的任何方法都不会。但是拥有
进入
(())
是错误的。正如我所说的,关于子shell的问题是如何将输入管道化到循环中。而
x |而
格式调用子shell。
(( total = user + nice + system + idle ))
echo -n "$cpu: $(( 100 * ($delta_total - $delta_idle) / $delta_total ))%% "