상단 명령 출력 필터링


12

Mac을 실행 중이고 topPID, COMMAND 및 % CPU 열만 표시되도록 특정 프로세스 에 대한 명령 출력을 필터링하려고합니다 .

프로세스의 PID를 얻은 후 다음을 실행합니다.

top -pid 1234

그러나 이것은 해당 프로세스에 대해 15 개가 넘는 열을 표시합니다. '명령의 출력을 awk로 파이프하고 다음 만 표시 할 수 있습니까?

PID COMMAND %CPU

열?

출력을 텍스트 파일에 저장 한 다음 처리하고 싶지 않습니다. 프로세스를 실시간으로 모니터링하고 싶습니다.

답변:


8
top -pid 3907 -stats "pid,command,cpu"
  • -pid 3907: 프로세스 ID
  • -stats pid,command,cpu: 프로세스 ID, 이름 및 CPU % 만 표시

awk출력 에서 실행할 필요가 없습니다 .


출력을 사후 처리하려면 로깅 모드 -l 0에서 실행 하는 데 사용 하십시오 (0은 무기한이며 다른 모든 것은 샘플 수를 제한 함). 출력은 다음과 같습니다 (두 번 반복).

Processes: 72 total, 3 running, 1 stuck, 68 sleeping, 326 threads 
2011/05/10 19:15:13
Load Avg: 0.14, 0.14, 0.09 
CPU usage: 20.0% user, 26.66% sys, 53.33% idle 
SharedLibs: 5304K resident, 5208K data, 0B linkedit.
MemRegions: 16345 total, 1048M resident, 54M private, 338M shared.
PhysMem: 726M wired, 1802M active, 687M inactive, 3215M used, 750M free.
VM: 169G vsize, 1036M framework vsize, 5261732(0) pageins, 552476(0) pageouts.
Networks: packets: 46747406/52G in, 32528901/3715M out.
Disks: 9452898/244G read, 11226269/293G written.

PID   COMMAND      %CPU
3907  WindowServer 0.0 
Processes: 72 total, 3 running, 1 stuck, 68 sleeping, 326 threads 
2011/05/10 19:15:14
Load Avg: 0.13, 0.14, 0.09 
CPU usage: 0.95% user, 1.90% sys, 97.14% idle 
SharedLibs: 5304K resident, 5208K data, 0B linkedit.
MemRegions: 16346 total, 906M resident, 54M private, 386M shared.
PhysMem: 726M wired, 1802M active, 687M inactive, 3215M used, 751M free.
VM: 169G vsize, 1036M framework vsize, 5261732(0) pageins, 552476(0) pageouts.
Networks: packets: 46747406/52G in, 32528901/3715M out.
Disks: 9452898/244G read, 11226269/293G written.

PID   COMMAND      %CPU
3907  WindowServer 2.7 

awk13 행마 다만 표시 하려면 또는 이와 유사한 도구를 사용하십시오 (이 행에는 해당 예의 값이 포함되어 있음).

$ top -l 0 -pid 3907 -stats pid,command,cpu | awk 'NR%13==0'
3907  WindowServer 0.0 
3907  WindowServer 1.3 
3907  WindowServer 2.2 

# top -p1 -stats "pid,command,cpu" top: unknown option 't'
AstraSerg

@AstraSerg 저에게 효과적입니다. 이것은 topLinux 와 다른 Mac OS 질문 입니다.
Daniel Beck

6

이것은 확실히 이루어질 수 있으며 어떻게해야하는지 설명 할 것입니다. 나는 이것이 최선의 접근법이라고 생각하지는 않지만 그 일을합니다. Linux (및 bash 셸)를 사용하고 있으므로 상단의 기본 동작이 약간 다를 수 있습니다. 따라서 특정 시나리오에 맞게이 미니 하우투를 조정해야 할 수도 있습니다.

  1. 인수없이 top을 실행 하십시오.

    $ top

    여기 내 출력의 헤더와 관련 줄이 있습니다.

    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

    2569 user 20 0 339m 86m 10m S 7.8 6.9 6:42.99 java

    메모리에 일정 시간 동안 머무르고 실제로 CPU를 소비하는 프로세스를 선택했으며 최종 목표에 도달하기위한 테스트 프로세스로 사용합니다.

  2. 기본적으로 top은 대화식 모드로 실행됩니다. 이것은 나에게 적합하지 않습니다. 관련 데이터를 캡처하여 인쇄하고 싶습니다. 그 후 데이터를 대화식으로 표시하는 작업을 처리하겠습니다. 맨 페이지의 관련 인용문 :

    -b : 배치 모드 작동 상단에서 다른 프로그램 또는 파일로 출력을 보내는 데 유용한 '배치 모드'에서 top을 시작합니다. 이 모드에서 top은 입력을 받아들이지 않으며 '-n'명령 줄 옵션으로 설정 한 반복 제한 또는 종료 될 때까지 실행됩니다.

    -n : 반복 횟수 제한 : -n number 종료하기 전에 top이 생성해야하는 최대 반복 횟수 또는 프레임 수를 지정합니다.

    출력을 한 번만 인쇄 한 다음 종료하는 조정 된 top 명령입니다.

    $ top -b -n 1

  3. 보고 싶은 PID를 알고 있으므로 맨 위에 제한을 하나 더 추가하여 해당 프로세스에 대한 데이터 만 인쇄합니다.

    $ top -b -n 1 -p 2569

  4. 배치 모드에서도 top은 여전히 ​​가동 시간, 여유 메모리 / 스왑 등과 같은 기타 시스템 전체 통계를 포함하는 헤더를 인쇄합니다. 필자는 필요하지 않습니다. 필요한 것은 프로세스에 대한 데이터를 포함하는 한 줄뿐이므로 다음과 같이 전체 출력에서 ​​잘라냅니다.

    $ top -b -n 1 -p 2569 | tail -n 2 | head -n 1

    보시다시피, 나는 두 번째 줄을 1에서 얻었습니다.

  5. 이 줄을 awk로 파이프하여 필요한 열만 추출합니다.

    $ top -b -n 1 -p 2569 | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}'

  6. 지금까지 명령 줄에서 이러한 조작을 해왔으며 이제는 하드 코딩 된 특정 사례에 지속성과 유연성을 추가해야합니다. 전체 줄을 간단한 쉘 스크립트로 옮기고 있습니다. 3top 이라고 부르 겠습니다 . 이름은 나중에 사용되기 때문에 강조됩니다.

    #!/bin/bash

    top -b -n 1 -p 2569 | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}'

  7. PID 번호는 하드 코딩되어 있습니다. 다음은 스크립트를 명령 줄 인수로 받아들이는 방법입니다.

    #!/bin/bash

    top -b -n 1 -p "$1" | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}'

    PID 2569에 대한 3 상 디스플레이 통계를 만들려면 다음과 같이 호출해야합니다.

    $ ./3top 2569

  8. 또한 CPU로드 후 백분율이 표시되기를 원하므로 3top 스크립트를 다음과 같이 조정합니다.

    #!/bin/bash

    out=$(top -b -n 1 -p "$1" | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}')

    echo "$out%"

    파이프를 통해 연결된 명령 체인의 전체 출력을 변수로 리디렉션했습니다. 그런 다음 echo를 사용하여 인쇄하고 끝에 CPU로드가 마지막 필드이므로 끝에 '%'를 추가하십시오.

  9. 이 시점에서 PID를 인수로 수락하고 통계를 한 번 인쇄하는 배치 스크립트가 있습니다. 실시간 모니터링을 원하십니까? 시계가 할 수 있기 때문에 쉽습니다 ! 다음과 같이 스크립트를 실행하십시오.

    $ watch -n 1 3top 2569

    초당 3top을 실행하여 실시간 모니터링을 수행합니다.


11
사용자는 OS X에 있고 Gnu가 없습니다 top. 잘못된 옵션 또는 구문 : -b . 왜 이것이 반복적으로 상향 조정되었는지 알 수 없습니다.
Daniel Beck

5
GNU top(는에서 procps) 브루, 핑크 또는 MacPorts를 사용하여 설치 될 수 있고, 사용 중 소스로부터 컴파일 할 수 없다 make거나 cc top.c.
Daniel Beck

2

top표시 형식은 사용자 정의 할 수 있지만, 명령 줄에서 표시 옵션을 지정하는 방법은 없다. 그러나 독창적이라면 ~/.toprc파일 을 영리하게 조작하여 필요한 작업을 수행 할 수 있습니다 .

표시를 사용자 정의 top하지 않았고 ~/.toprc파일 이없는 것으로 가정합니다 .

  1. 시작하십시오 top.
  2. f필드 선택 모드로 들어가려면 누릅니다 .
  3. 이있는 각 필드에 대해 *당신이 원하는하지 않는 것이 그 옆을 눌러 해당 문자는 해당 필드를 선택 해제합니다. 예를 들어,를 눌러 필드 e를 선택 취소하십시오 User Name. 이 완료되면, 당신은 단지이 있어야 *다음을 Process Id, CPU usage그리고 Command name/line.
  4. Space메인 창으로 돌아가려면을 누르십시오 .
  5. W(예 : Shift+ w)를 눌러 현재 레이아웃을 ~/.toprc파일 에 저장 하십시오.
  6. 종료 top한 다음 다시 시작하여 설정이 저장되었는지 확인하십시오.
  7. 기본 레이아웃으로 돌아가려면 시작하기 전과 ~/.toprc같은 이름 으로 변경하십시오 . 최소 레이아웃으로 전환하려면 시작 하기 전에로 이름을 바꾸십시오 .~/min.toprctop~/min.toprc~/.toprctop

이 파일 이름 바꾸기 및 실행 top은 아마도 나보다 더 많은 경험과 지식을 가진 사람이 간단한 쉘 스크립트로 작업 할 수 있습니다. 일반 top레이아웃이 이미 사용자 정의 된 경우 특별히 고려해야합니다 .


필터를 수동으로 추가하더라도 가능 .toprc합니까? RUID>999시작할 때 필터를 추가하고 싶습니다 .
Dr Beco
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.