열 이름과 프로세스 이름으로 값을 가져오려고 하면 잘못된 값이 나타납니다.

열 이름과 프로세스 이름으로 값을 가져오려고 하면 잘못된 값이 나타납니다.

안정성 테스트 중에 CPU 및 메모리 사용률을 모니터링하는 스크립트를 작성 중이며 최종적으로는 이를 차트나 기타 시각화 도구로 표시하고 싶습니다. 이를 위해 열 이름으로 상위 명령에서 %CPU 및 %MEM을 추출하려고 했습니다.

   ##to get indexes of columns I need 
   indexCPU=$(top -b -n 1 | grep PID | tr -s ' ' '\n' | nl -nln |  grep "%CPU" | cut -f1)
   infexMEM=$(top -b -n 1 | grep PID | tr -s ' ' '\n' | nl -nln |  grep "%MEM" | cut -f1)

   ## get values from top in a while loop
   while [ $UPTIME -lt $DURRATION ]; do
   scpu=$(top -b -n 1| grep -w squeezer | tr -s ' ' | cut -d ' ' -f $indexCPU )
   smem=$(top -b -n 1| grep -w squeezer | tr -s ' ' | cut -d ' ' -f $infexMEM )
   echo "$scpu     $smem" >> stabilityTestUsageM.txt
   sleep 300
   done

이제 이 작업을 수행하면 때로는 올바른 값을 얻지만 다른 경우에는 왼쪽 값을 얻습니다.

예를 들어, 출력을 얻었습니다.

    S

이를 위해:

    top -b -n 1| grep -w squeezer | tr -s ' ' | cut -d ' ' -f $indexCPU

이것은 top -b -n 1| grep -w 압출기의 결과입니다.

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
    8048 root      20   0 1953716 442376   8460 S   0.0  2.7   0:30.97 squeezer

무엇이 문제인지 아시나요?

감사해요

답변1

top접근 방식의 문제점은 필드 nr을 식별하는 첫 번째 단계에서 개수에서 "null 필드"(출력에서 선행 공백으로 생성됨)를 생략한다는 것입니다. 그러나 cut구분 기호를 단일 공백으로 설정하면 공백으로 시작하는 줄의 시작 부분에 빈 필드가 있는 것으로 해석됩니다. 따라서 귀하가 결정한 필드 번호는 nl -nln필드 계산 방식에 비해 1이 적습니다.cut

그러나 일반적으로 다음을 권장합니다 awk.

top -b -n 1 | awk '$NF=="squeezer" {print $9}'

마지막 공백으로 구분된 필드(명령어)가 "squeezer"인 줄의 9번째 필드(CPU 사용량)가 인쇄되어야 합니다.

쉽게 결정할 수 있도록 CPU 필드를 이름으로 식별하려면 다음 방법을 사용할 수 있습니다.

top -b -n 1 | awk '!i&&/PID/{for (i=1;i<=NF;i++) {if ($i=="%CPU") break}} '$NF=="squeezer" {print $i}}'

이는 먼저 열 헤더를 포함하는 행의 모든 ​​필드를 반복하고 PID읽은 필드(따라서 관련 필드 번호를 포함함)에 도달하면 루프를 중단합니다. 그런 다음 마지막 필드가 구문 분석하려는 명령인 줄의 필드를 인쇄합니다. 안전 조치로 문자열이 포함된 첫 번째 줄만 고려됩니다(프로세스 이름에도 문자열이 포함될 수 있는 경우).%CPUiPID

이 매우 간단한 접근 방식은 인수 없이 명령을 나열할 때만 작동합니다. 즉, 공백으로 구분된 마지막 필드는 실제로 명령줄 인수가 아닌 명령일 뿐입니다.

다른 부분에 대해서는 사이트 가이드라인에 따라 별도의 질문을 하셔야 합니다.

관련 정보