在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 ))%% "