programing tip

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

itbloger 2020. 10. 11. 09:14
반응형

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


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

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


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

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

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

설명:

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

모니터링 할 프로세스의 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

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


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


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

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

사용 시계 명령을

watch -d 'top -n1 | grep mysql'

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

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

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


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

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

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

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


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

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


나는 그것을 실행합니다 (예.) : top -b | egrep -w 'java|mysqld'


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

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

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

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


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

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


나는 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가있는 모든 행을 인쇄합니다. 덤프 파일은 더보기 쉬운 루프에 사용됩니다.


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


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

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

지금까지 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.

So firstly, we obtain the list of process ids which have process name "java":

pgrep java

and we pipe this to awk which joins the results with delimitor " -pid "

| awk 'ORS=" -pid "'

Alas, this leaves a trailing delimitor! For example, we may so far have obtained the string "123 -pid 456 -pid 789 -pid ".

We then just use sed to shave off the final 6 characters of the delimitor.

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

We're ready to pass the results to top:

top -pid `...`

Using the approach mentioned in the answer by Rick Byers:

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

but I had more than 20 processes running so following command can be helpful for someone who encounter a similar situation.

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

pgrep gets the list of processes with given name - java in this case. head is used to get first 20 pids because top cannot handle more than 20 pids when using -p argument. Finally paste joins the list of pids with ','.

You can control the process name you are looking for in the above command and the number of processes with that name you are interested to watch. You can ignore the head -n 20 part if the number of your processes with the given name is less than 20.

참고URL : https://stackoverflow.com/questions/3727793/limit-the-output-of-the-top-command-to-a-specific-process-name

반응형