2014-07-24 2 views
0

리눅스에서 단일 프로세스의 CPU 코어 활용률을 추출하고 구문 분석하는 방법을 알아 내려고합니다. 나는 top을 통해 전반적인 핵심 활용도를 얻은 다음 "1"을 누를 수 있음을 안다. 나는 이미 그것을 파싱 할 수있다. 그러나 이제는 단일 프로세스에 대해 동일한 작업을 수행하려고합니다. 나는 ps로 시도하고 코어 활용도를 스스로 계산하지만 내 스크립트가 충분히 정확하다면 뭔가 확신이 들지 않는다. 이 오류가 단지 무작위로 발생하는 이유리눅스 - 하나의 프로세스에 대한 코어 활용을 파일로 추출

test.sh: line 31: +: syntax error: operand expected (error token is "+")

내가 알아낼 수 없습니다 : 내 터미널에서 잠시 후이 같은 오류를 얻을 (이 WIP 때문에이 버전은 전체의 핵심 활용도를 계산합니다).

#!/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 

이 문제를 해결하는 방법에 대한 아이디어가 있습니까?

나는 특정 프로세스의 CPU 사용률을 얻을 수있는 실제 요청을 보면 어떤 조언

+0

'bash -x'를 사용하여 스크립트를 실행하여 오류의 원인을 확인하십시오. – konsolebox

답변

0

에 대한 기쁘다; 이것은 적은 라인에서 이루어질 수있다. 예 : 아래는 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