top 명령을 호출하면 실행중인 모든 프로세스를 가져옵니다. 그러나 출력 을 "java"와 같은 특정 프로세스 이름으로 만 제한 하려면 어떻게 해야합니까?
나는 이것을 시도했다 -l 2 | grep java 하지만 이렇게하면 지속적으로 업데이트되는 목록이 아닌 스냅 샷 만 가져옵니다. 그리고 top -l 0 | grep java 는 실제로 명확하지 않습니다.
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/,$//'
여기에서 후행 쉼표를 제거하는 데 사용됩니다.top: pid limit (20) exceeded
. 어쨌든 그 한계 근처에 있습니까?
top -p $(pgrep process-name | head -20 | tr "\\n" "," | sed 's/,$//')
. 에서 반환 한 최대 처음 20 개의 PID에 대한 데이터가 표시됩니다 pgrep
.
-pid
대신 -p
.
모니터링하려는 프로세스의 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
(쉼표로 구분 된 목록을 전달할 수도 있습니다.)
@dogbane의 답변을 확장 pgrep
하면 다음을 수행 하기 위해 명명 된 프로세스에 대한 모든 PID를 얻을 수 있습니다 .
top -p "$(pgrep -d ',' java)"
top -p "$(pgrep -d ',' php)" top: pid limit (20) exceeded
man top
"이 옵션은 최대 20 회까지 제공하거나 최대 20 개의 pid로 쉼표로 구분 된 목록을 제공 할 수 있습니다." 잘 됐어.
사용 시계 명령을
watch -d 'top -n1 | grep mysql'
man watch
: " watch는 명령을 반복적으로 실행하여 출력 및 오류를 표시합니다. "; 처럼 현재 실행중인 프로세스를 표시하지 않습니다 top
않습니다
watch -d 'top -b -n1 | grep mysql'
.. 같은 이름의 서버에서 실행중인 프로세스가 20 개 이상이라면 도움이되지 않습니다.
최고 -p pgrep oracle | head -n 20 | tr "\\n" "," | sed 's/,$//'
더 많은 자원을 소비하는 다른 프로세스를 놓칠 가능성이 높은 20 개 프로세스의 실시간 출력을 나열하고 제공하려고합니다.
나는 여전히 이것에 대한 더 나은 옵션을 찾고 있습니다.
나는 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가있는 모든 행을 인쇄합니다. 덤프 파일은보다보기 쉬운 루프에 사용됩니다.
아래를 실행하면 콘솔에서 지속적인 업데이트가 제공됩니다.
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
.
따라서 먼저 프로세스 이름이 "java"인 프로세스 ID 목록을 얻습니다.
pgrep java
awk
결과를 구분 기호로 연결하는 파이프" -pid "
| awk 'ORS=" -pid "'
아아, 이것은 후행 구분자를 남깁니다! 예를 들어, 지금까지 문자열 "123 -pid 456 -pid 789 -pid "
.
그런 다음 구분 기호 sed
의 마지막 6 개 문자를 깎기 위해 사용 합니다.
| sed 's/.\{6\}$//'`
결과를 top
다음 으로 전달할 준비가되었습니다 .
top -pid `...`
프로세스의 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를 통해 바쁜 서버에서 유용합니다.
Rick Byers의 답변에 언급 된 접근 방식 사용 :
top -p `pgrep java | paste -sd "," -`
하지만 20 개 이상의 프로세스가 실행 중이므로 다음 명령이 비슷한 상황에 처한 사람에게 도움이 될 수 있습니다.
top -p `pgrep java | head -n 20 | paste -sd "," -`
pgrep
주어진 이름의 프로세스 목록을 가져옵니다-이 경우에는 java. head
top은 -p 인수를 사용할 때 20 개 이상의 pid를 처리 할 수 없기 때문에 처음 20 개의 pid를 얻는 데 사용됩니다. 마지막으로 paste
','로 pid 목록을 결합합니다.
위의 명령에서 찾고있는 프로세스 이름과 관심있는 해당 이름의 프로세스 수를 제어 할 수 있습니다. head -n 20
주어진 이름의 프로세스 수가 20 개 미만인 경우 부분을 무시할 수 있습니다 .