Linux - 将单个进程的核心利用率提取到文件

时间:2014-07-24 09:07:28

标签: linux bash process core utilization

我试图弄清楚如何在linux中提取单个进程的cpu核心利用率并解析它。我知道我可以通过top获得整体核心利用率,然后按" 1"。我已经能够解析它了。但是,现在我想为一个进程做同样的事情。我尝试用ps并自己计算核心利用率,但我不太确定我的脚本是否足够准确,似乎有些东西。 (请注意,此版本计算整体核心利用率,因为它是WIP)我在终端中出现一段时间后会出现这样的错误:

  

test.sh:第31行:+:语法错误:操作数预期(错误标记为   " +&#34)

我无法弄清楚为什么这个错误随机发生。

#!/bin/env bash
read -p "Enter PID to observe:" pid
run=false
ps -p $pid -L -o cputime,etime,psr,pcpu

for (( u = 1 ; u <= 100 ; u++ ))
do

lines=$(ps -p $pid -L -o psr,pcpu | awk 'END{print NR}')


    for (( i=1; i<=$lines; i++))
    do


        core=$(ps -p $pid -L -o psr,pcpu | awk 'NR=='$i'{print $1}')

        if [ $run == false ]

            then cpuTimeS=+$(ps -p $pid -L -o cputime,etime | awk 'NR=='$i'{print $1}' | awk -F : '{ printf("%.2f\n", $1*60+$2*60+$3); }')
            elapsedTimeS=+$(ps -p $pid -L -o cputime,etime | awk 'NR=='$i'{print $2}' | awk -F : '{ printf("%.2f\n", $1*60+$2*60+$3); }')

            cpuTimeSi=${cpuTimeS%.*}        
            elapsedTimeSi=${elapsedTimeS%.*}

            cpuTimeSiResult=$(( cpuTimeSi + cpuTimeSiResult ))
            elapsedTimeSiResult=$(( elapsedTimeSi + elapsedTimeSiResult ))

            else
            cpuTimeE=+$(ps -p $pid -L -o cputime,etime | awk 'NR=='$i'{print $1}' | awk -F : '{ printf("%.2f\n", $1*60+$2*60+$3); }')
            elapsedTimeE=+$(ps -p $pid -L -o cputime,etime | awk 'NR=='$i'{print $2}' | awk -F : '{ printf("%.2f\n", $1*60+$2*60+$3); }')

            cpuTimeEi=${cpuTimeE%.*}        
            elapsedTimeEi=${elapsedTimeE%.*}

            cpuTimeEiResult=$(( cpuTimeEi + cpuTimeEiResult ))
            elapsedTimeEiResult=$(( elapsedTimeEi + elapsedTimeEiResult ))

        fi  
done

if [ "$run" = true ]

        then result=$( echo "scale=2; ($cpuTimeEiResult - $cpuTimeSiResult) / ($elapsedTimeEiResult - $elapsedTimeSiResult) * 100.0" | bc)
        echo "RESULT:" $result
        echo "cpuTimeSTART:" $cpuTimeSiResult
        echo "elapsedTimeSTART:" $elapsedTimeSiResult
        echo "cpuTimeEND:" $cpuTimeEiResult
        echo "elapsedTimeEND:" $elapsedTimeEiResult

fi

sleep 1

if [ "$run" = false ]
    then run=true
else
    run=false
fi



done

对于如何更好地解决这个问题有什么想法吗?

我很高兴任何建议

1 个答案:

答案 0 :(得分:0)

查看实际请求以获取特定进程的CPU利用率;这可以用更少的线来完成;例如以下是给出seq命令后的CPU使用率。

#using the process name
$ ps -C seq -o %cpu
%CPU
10.4

#using the process id
$ ps -p 5710 -o %cpu
%CPU
10.4