TOP 명령의 출력을 특정 프로세스 이름으로 제한


81

top 명령을 호출하면 실행중인 모든 프로세스를 가져옵니다. 그러나 출력 을 "java"와 같은 특정 프로세스 이름으로제한 하려면 어떻게 해야합니까?

나는 이것을 시도했다 -l 2 | grep java 하지만 이렇게하면 지속적으로 업데이트되는 목록이 아닌 스냅 샷 만 가져옵니다. 그리고 top -l 0 | grep java 는 실제로 명확하지 않습니다.


5
불행히도 지금까지 -p & -b는 OS X의 top 명령에서 지원되지 않기 때문에 아직 유효한 대답이 없습니다 .
Alex

나는 처음 OSX 솔루션보다 어쩌면 무엇을 게시 한 - 단지 시간의 대화명에)
안티 지구를

답변:


131

다음을 선호하므로 실행할 때마다 pid를 조회하지 않고도 대화식으로 top을 사용할 수 있습니다.

top -p `pgrep process-name | tr "\\n" "," | sed 's/,$//'`

물론 프로세스가 변경되면 명령을 다시 실행해야합니다.

설명:

  • pgrep process-name 줄 바꿈으로 구분 된 프로세스 ID 목록을 반환합니다.
  • tr "\\n" "," top은 쉼표로 구분 된 프로세스 ID 목록을 원하기 때문에 이러한 줄 바꿈을 쉼표로 변환합니다.
  • sed스트림 편집기이며 sed 's/,$//'여기에서 후행 쉼표를 제거하는 데 사용됩니다.

2
최선의 대답은 dogbane을 개선하여 많은 PID를 붙여 넣는 대신 실제 이름을 입력 할 수 있습니다. (그리고 이것은 SO)
sabgenton 2013 년

1
할 수만 있다면 여러 번 당신에게 투표 할 것입니다. 이것은 정말로 "수락 된"대답이어야한다고 생각합니다.
spuriousdata

6
나는 top: pid limit (20) exceeded. 어쨌든 그 한계 근처에 있습니까?
celwell 2013 년

7
@celwell, 시도하십시오 top -p $(pgrep process-name | head -20 | tr "\\n" "," | sed 's/,$//'). 에서 반환 한 최대 처음 20 개의 PID에 대한 데이터가 표시됩니다 pgrep.
Acumenus 2013

3
요세미티 (또는 이전 버전?)에서는 -pid대신 -p.
최대

53

모니터링하려는 프로세스의 pid를 찾은 다음 명령 -p에 pid 목록을 제공 할 수 있는 옵션 을 사용하십시오 top.

예:

top -p 18884 -p 18892 -p 18919

  PID USER     PRI  NI  SIZE  RSS SHARE STAT %CPU %MEM   TIME CPU COMMAND
18884 user  25   0  672M  95M  9476 S     0.0  1.1   0:02   1 java
18892 user  25   0 2280M 123M 12252 S     0.0  1.5   0:05   1 java
18919 user  22   0 1492M 198M 28708 S     0.0  2.4   0:07   1 java

(쉼표로 구분 된 목록을 전달할 수도 있습니다.)


7
Mac에서는 "top -pid ID"여야하지만 Java 프로세스에는 여러 개의 Java 프로세스가있을 수 있으므로 고유 한 ID가 여러 개있을 수 있습니다.
Alex

32

방법에 대한 최고 -b | grep 자바


1
Mac에서는 GPL 도구가 아닌 BSD 도구를 사용하기 때문에 Mac에서는 작동하지 않습니다. 그리고 약간의 차이가 있습니다. "-b"버전이 "-l 0"과 비슷하지만 테이블의 헤더도 인쇄된다고 가정합니다.
Alex는

29

@dogbane의 답변을 확장 pgrep하면 다음을 수행 하기 위해 명명 된 프로세스에 대한 모든 PID를 얻을 수 있습니다 .

top -p "$(pgrep -d ',' java)"

2
최대 한도는 20 개입니다
mrP 2010 년

top -p "$(pgrep -d ',' php)" top: pid limit (20) exceeded
mrP

네가 옳아! man top"이 옵션은 최대 20 회까지 제공하거나 최대 20 개의 pid로 쉼표로 구분 된 목록을 제공 할 수 있습니다." 잘 됐어.
l0b0

6

사용 시계 명령을

watch -d 'top -n1 | grep mysql'

"watch -d"여야합니다. 그러나이 명령을 실행하는 출력이 없습니다.
Alex는

-1 : man watch: " watch는 명령을 반복적으로 실행하여 출력 및 오류를 표시합니다. "; 처럼 현재 실행중인 프로세스를 표시하지 않습니다 top않습니다
sdaau

@AlexanderOrlov, 여기에는 특별한 마법이 없습니다. top -n1을 사용하여 인쇄하고 종료하고 watch를 사용하여 지속적으로 모니터링하십시오.
tszming

@sdaau, 귀하의 의견은 내 대답과 관련이 없습니다. 다음에 더 신중하게 답장하십시오.
tszming

1
-b 옵션을 추가해야한다고 생각합니다. watch -d 'top -b -n1 | grep mysql'
레예스 양

6

여기 의 답 을 사용하여 하나의 라이너를 만들 수있었습니다

top -pid $(pgrep process_name | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ -pid /g')

이것은 MacOS 10.12 (Sierra)에서 나를 위해 작동합니다.


2

다음을 사용하여 문제를 해결했습니다.

상단 -n1 -b | grep "프로세스 이름"

이 경우 : -n은 top이 어떤 프로세스를 몇 번 할 것인지 설정하는
데 사용되고 -b는 모든 pid를 표시하는 데 사용됩니다.

다음과 같은 오류를 방지합니다. top : pid limit (20) exceeded


2

다음 코드는 watch 명령을 통해 5 초마다 프로세스 목록을 업데이트합니다.

watch -n 5 -t top -b -n 1 -p$(pgrep java | head -20 | tr "\\n" "," | sed 's/,$//')



1

.. 같은 이름의 서버에서 실행중인 프로세스가 20 개 이상이라면 도움이되지 않습니다.

최고 -p pgrep oracle | head -n 20 | tr "\\n" "," | sed 's/,$//'

더 많은 자원을 소비하는 다른 프로세스를 놓칠 가능성이 높은 20 개 프로세스의 실시간 출력을 나열하고 제공하려고합니다.

나는 여전히 이것에 대한 더 나은 옵션을 찾고 있습니다.


0

실제로 찾고 있던 것과 같은 더 구체적인 경우 :

를 들어 자바 프로세스 당신은 또한 사용할 수 jps -q있다 JPS가 에서 도구입니다 $ JAVA_HOME / 빈은 이 $ PATH에 있어야 그러므로합니다.


0

나는 OSX에서 이것에 대한 답을 찾기 위해 여기에 왔습니다. 나는 bash와 awk로 내가 원하는 것을 얻었습니다.

topfiltered() {
  [[ -z "$1" ]] && return
  dump="/tmp/top_dump"
  rm -f "$dump"
  while :; do
    clear
    [[ -s "$dump" ]] && head -n $(( $LINES - 1 )) "$dump"
    top -l 1 -o cpu -ncols $(( $COLUMNS / 8 )) | awk -v p="$(pgrep -d ' ' $@)" '
        BEGIN { split(p, arr); for (k in arr) pids[arr[k]]=1 }
        NR<=12 || ($1 in pids)
    ' >"$dump"
  done
}

로깅 모드에서 top을 반복하고 awk로 필터링하여 pgrep의 출력에서 ​​연관 배열을 만듭니다. Awk는 처음 12 행을 인쇄합니다. 여기서 12 행은 열 헤더이고 배열의 키인 pid가있는 모든 행을 인쇄합니다. 덤프 파일은보다보기 쉬운 루프에 사용됩니다.


OSX에서는 pgrep <process_name> 같은 것을 사용할 수 있습니다. top -pid <pid_specified_by_pgrep>
bergercookie apr

0

단지 top -bn 1 | grep java당신을 위해 트릭을 할 것입니다


0

아래를 실행하면 콘솔에서 지속적인 업데이트가 제공됩니다.

bcsmc2rtese001 [~]$ echo $SHELL  
/bin/bash  
bcsmc2rtese001 [~]$ top | grep efare  or watch -d 'top | grep efare' or top -p pid
27728 efare     15   0 75184 3180 1124 S  0.3  0.0 728:28.93 tclsh  
27728 efare     15   0 75184 3180 1124 S  0.7  0.0 728:28.95 tclsh

0

지금까지 MacOS를위한 유일한 솔루션 은 다음과 같습니다 .

top -pid `pgrep java | awk 'ORS=" -pid "' | sed 's/.\{6\}$//'`

살아있는 프로세스 invalid option or syntax: -pid가 없으면 원하지 않게보고 됩니다 java.

설명

여기에 게시 된 다른 솔루션은 형식을 사용 top -p id1,id2,id3하지만 MacOS top는 다루기 힘든 형식 만 지원합니다 top -pid id1 -pid id2 -pid id3.

따라서 먼저 프로세스 이름이 "java"인 프로세스 ID 목록을 얻습니다.

pgrep java

awk결과를 구분 기호로 연결하는 파이프" -pid "

| awk 'ORS=" -pid "'

아아, 이것은 후행 구분자를 남깁니다! 예를 들어, 지금까지 문자열 "123 -pid 456 -pid 789 -pid ".

그런 다음 구분 기호 sed의 마지막 6 개 문자를 깎기 위해 사용 합니다.

| sed 's/.\{6\}$//'`

결과를 top다음 으로 전달할 준비가되었습니다 .

top -pid `...`

0

프로세스의 PID를 얻으십시오.

# pidof <process>

표시 할 프로세스 pid (들)를 맨 위에 알려주십시오.

# top -p <pid1>,<pid2>, etc

예:

landis@linux-e6510:~>pidof konsole
1841 1709
landis@linux-e6510:~>top -p 1841,1709

Top은 2 개의 'konsole'프로세스 만 표시합니다. 이것은 grep을 통해 파이프 할 필요없이 ssh를 통해 바쁜 서버에서 유용합니다.


죄송합니다. 문제의 macos 태그를 보지 못했습니다. 내 모든 리눅스 박스에서 작동합니다.
Landis Reed

-1

Rick Byers의 답변에 언급 된 접근 방식 사용 :

top -p `pgrep java | paste -sd "," -`

하지만 20 개 이상의 프로세스가 실행 중이므로 다음 명령이 비슷한 상황에 처한 사람에게 도움이 될 수 있습니다.

top -p `pgrep java | head -n 20 | paste -sd "," -`

pgrep주어진 이름의 프로세스 목록을 가져옵니다-이 경우에는 java. headtop은 -p 인수를 사용할 때 20 개 이상의 pid를 처리 할 수 ​​없기 때문에 처음 20 개의 pid를 얻는 데 사용됩니다. 마지막으로 paste','로 pid 목록을 결합합니다.

위의 명령에서 찾고있는 프로세스 이름과 관심있는 해당 이름의 프로세스 수를 제어 할 수 있습니다. head -n 20주어진 이름의 프로세스 수가 20 개 미만인 경우 부분을 무시할 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.