프로세스가 Linux에 가지고있는 모든 스레드의 세부 사항을 볼 수있는 방법이 있습니까?


101

Windows의 경우 프로세스 탐색기 에 프로세스 아래의 모든 스레드가 표시됩니다.

특정 프로세스가 생성하는 모든 스레드에 대한 세부 정보를 표시 할 수있는 Linux 용 명령 줄 유틸리티가 있습니까?


나는 내가 더 분명하게해야한다고 생각한다. 프로세스 계층 구조를보고 싶지 않지만 특정 프로세스에서 생성 된 모든 스레드 목록

이 스크린 샷을보십시오

대체 텍스트

리눅스에서 어떻게 이것을 달성 할 수 있습니까? 감사!


답변:


101

top기본 도구 는 기본적으로 프로세스를 표시하지만 H키 누름 또는 -H명령 행 옵션으로 스레드를 표시하도록 지시 할 수 있습니다 . htop 도 있는데 , 이것은 비슷 top하지만 스크롤과 색상이 있습니다. 기본적으로 모든 스레드를 표시하지만이 기능은 해제 할 수 있습니다. ps또한 스레드를 표시하는 몇 가지 옵션이 있으며 특히 H-L.

예를 들어 대한 스레드에 대한 정보를 표시 할 수 있습니다 GUI 도구도 있습니다 QPS (약 간단한 GUI 래퍼 ps) 또는 conky (구성 옵션이 많은 시스템 모니터).

각 프로세스마다 프로세스 ID가있는 /proc/12345위치 에서 많은 정보를 사용할 수 있습니다 12345. 각 스레드에 대한 정보 는 커널 스레드 ID가있는 /proc/12345/task/67890위치 에서 사용 가능 67890합니다. 이 곳 ps에서 top다른 도구가 정보를 얻습니다.


htop실을 보여주지 않는 것 같습니다. H스레드를 표시하거나 숨기는 것 사이를 전환하는 방법 으로이 키를 언급 하지만 여전히 도움말 키로 작동합니다 .
Alexis Wilke

1
h도움말을 보려면 @AlexisWilke 소문자 , H스레드를 표시하거나 숨기려면 대문자 입니다.
Gilles

58

Linux에서 스레드 나열

현재 답변 제공

여기에있는 각 대답은 프로세스와 관련된 모든 스레드 목록을 지정한 것을 정확하게 제공하고 있음을 분명히하고 싶습니다. htop기본적으로 시스템의 모든 스레드를 나열 하므로 명확하지 않을 수 있습니다 . 프로세스뿐만 아니라 다음 top -H -p <pid>과 같이 더 잘 작동합니다.

top - 00:03:29 up 3 days, 14:49,  5 users,  load average: 0.76, 0.33, 0.18
Tasks:  18 total,   0 running,  18 sleeping,   0 stopped,   0 zombie
Cpu(s): 22.6%us,  5.7%sy,  4.2%ni, 66.2%id,  0.8%wa,  0.5%hi,  0.1%si,  0.0%st
Mem:   2063948k total,  1937744k used,   126204k free,   528256k buffers
Swap:  1052220k total,    11628k used,  1040592k free,   539684k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
30170 daniel    20   0  371m 140m 107m S 10.0  7.0   0:31.37 source:src
30066 daniel   -90   0  371m 140m 107m S  2.0  7.0   0:07.87 clementine
30046 daniel    20   0  371m 140m 107m S  0.0  7.0   0:32.05 clementine
30049 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.03 clementine
30050 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.31 clementine
30051 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.00 clementine
30052 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.00 clementine
30053 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.00 clementine
30054 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.03 clementine
30055 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.00 clementine
30056 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.00 clementine
30057 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.04 clementine
30058 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.00 clementine
30060 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.16 clementine
30061 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.00 clementine
30062 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.00 clementine
30064 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.00 clementine
30065 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.00 clementine

참고로, 스레드 -90는 실제로 실시간 스레드입니다.

그러나

진정한 CLI 인 또 다른 옵션이 있습니다. ps -e -T | grep <application name or pid>

  • -e 모든 과정을 보여줍니다
  • -T 모든 스레드를 나열합니다
  • | 출력을 다음 명령으로 파이프
  • grep 이것은 내용을 필터링

예를 들면 다음과 같습니다.

$ ps -e -T | grep clementine
  PID  SPID TTY          TIME CMD       # this is here for clarity
30046 30046 pts/2    00:00:17 clementine
30046 30049 pts/2    00:00:00 clementine
30046 30050 pts/2    00:00:00 clementine
30046 30051 pts/2    00:00:00 clementine
30046 30052 pts/2    00:00:00 clementine
30046 30053 pts/2    00:00:00 clementine
30046 30054 pts/2    00:00:00 clementine
30046 30055 pts/2    00:00:00 clementine
30046 30056 pts/2    00:00:00 clementine
30046 30057 pts/2    00:00:00 clementine
30046 30058 pts/2    00:00:00 clementine
30046 30060 pts/2    00:00:00 clementine
30046 30061 pts/2    00:00:00 clementine
30046 30062 pts/2    00:00:00 clementine
30046 30064 pts/2    00:00:00 clementine
30046 30065 pts/2    00:00:00 clementine
30046 30066 pts/2    00:00:03 clementine

이들 각각은 동일한 PID를 가지므로 동일한 프로세스에 있음을 알 수 있습니다.


3
감사! SPID의 약자
Lazer

7
grep이 더 복잡해지지 않는 한 grep이 약간 흐릿하므로 ps -Tp <pid>도 있습니다.
토마스 테멜

4
sed대신 사용 grep하면 간단한 코드로 제목을 보존 할 수 있습니다.ps -e -T | sed -n '1p; /clementine/p;'
Mei

고맙습니다 @Daniel, 나는 우리가 멀티 캐스트에서와 같이이 PID를 사용하여 그룹을 만들 수 있습니까?
나사로

1
SPID는 혼란스럽게 스레드 ID입니다.
CMCDragonkai

36

top의 curses 버전 인 htop 에는 각 프로세스의 모든 스레드를 트리보기로 표시하는 표시 옵션이 있습니다. 시작 htop하고 누르면 다음과 같은 F5결과가 나타납니다.

htop의 스크린 샷


21

다음을 사용하려고 할 수 있습니다.

/usr/bin/pstree $PID

예를 들면 다음과 같습니다.

# pstree -p `pidof iceweasel`
iceweasel(3630)─┬─{iceweasel}(3662)
                ├─{iceweasel}(3663)
                ├─{iceweasel}(3664)
                ├─{iceweasel}(3665)
                ├─{iceweasel}(3666)
                ├─{iceweasel}(3674)
                ├─{iceweasel}(3675)
                ├─{iceweasel}(3676)
                ├─{iceweasel}(3677)
                ├─{iceweasel}(3681)
                ├─{iceweasel}(3682)
                ...

각 스레드에는 자체 PID가 있습니다.


각 프로세스에는 고유 한 프로세스 ID (pid)가 있습니다. pstree는 프로세스 내부의 스레드를 보여주지 않습니다
bjelli

13

두 개의 표준 툴 프로세스 정보가 보여 pstop(및 htop/ 유사하다 개선 ).

노트:

  • 많은 프로그램이 스레드의 겉보기 이름을 의미있는 것으로 변경합니다. 아래 도구는 이진 이름 또는 겉보기 이름을 표시 할 수 있습니다 (아래 예에서 PID 1086 확인).
  • 아래 예에서는 답변을 짧게 유지하기 위해 대부분의 프로세스를 제거했습니다.
  • 아래의 명령 인수 예제는 일반적인 것입니다. (다른 옵션에 대한 맨 페이지를 확인 ps -m, ps m, ps H...)

다음을 사용하여 전체 또는 프로세스의 실시간보기 top -H

top - 16:24:42 up  3:49,  3 users,  load average: 0.23, 0.29, 0.31
Threads: 503 total,   2 running, 501 sleeping,   0 stopped,   0 zombie
%Cpu(s):  9.7 us,  1.6 sy,  0.0 ni, 88.5 id,  0.2 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:   3938668 total,  2148708 used,  1789960 free,   133524 buffers
KiB Swap:  3903484 total,        0 used,  3903484 free.   822904 cached Mem

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
 1054 root      20   0  258664   3524   2692 S  0.0  0.1   0:00.00 rsyslogd
 1086 root      20   0  258664   3524   2692 S  0.0  0.1   0:00.03 in:imuxsock
 1087 root      20   0  258664   3524   2692 S  0.0  0.1   0:00.00 in:imklog
 1090 root      20   0  258664   3524   2692 S  0.0  0.1   0:00.05 rs:main Q:Reg
 2452 fpiat     20   0   25292   7520   3580 S  0.0  0.2   0:00.69 bash         
 2495 fpiat     20   0   25088   6988   3256 S  0.0  0.2   0:00.05 bash

다음을 사용하여 모든 프로세스 및 스레드를 즉시 볼 수 있습니다. ps -eLf

$ ps -eLf
UID        PID  PPID   LWP  C NLWP STIME TTY          TIME CMD
root      1054     1  1054  0    4 12:34 ?        00:00:00 /usr/sbin/rsyslogd -n
root      1054     1  1086  0    4 12:34 ?        00:00:00 /usr/sbin/rsyslogd -n
root      1054     1  1087  0    4 12:34 ?        00:00:00 /usr/sbin/rsyslogd -n
root      1054     1  1090  0    4 12:34 ?        00:00:00 /usr/sbin/rsyslogd -n
franklin  2452  2448  2452  0    1 12:35 pts/0    00:00:00 /bin/bash
franklin  2495  2448  2495  0    1 12:36 pts/1    00:00:00 /bin/bash

프로세스의 스레드 정보를 사용하여 ps -T

ps -T -C rsyslogd
  PID  SPID TTY          TIME CMD
 1054  1054 ?        00:00:00 rsyslogd
 1054  1086 ?        00:00:00 in:imuxsock
 1054  1087 ?        00:00:00 in:imklog
 1054  1090 ?        00:00:00 rs:main Q:Reg

(참고 : 두 옵션을 사용 -C command하거나 -p PID프로세스를 선택)

사용자 정의를 사용하여 프로세스의 스레드 정보를 자세히 설명합니다. ps

$ ps -L -o pid,lwp,pri,nice,start,stat,bsdtime,cmd,comm  -C rsyslogd
  PID   LWP PRI  NI  STARTED STAT   TIME CMD                         COMMAND
 1054  1054  19   0 12:34:53 Ssl    0:00 /usr/sbin/rsyslogd -n       rsyslogd
 1054  1086  19   0 12:34:53 Ssl    0:00 /usr/sbin/rsyslogd -n       in:imuxsock
 1054  1087  19   0 12:34:53 Ssl    0:00 /usr/sbin/rsyslogd -n       in:imklog
 1054  1090  19   0 12:34:53 Ssl    0:00 /usr/sbin/rsyslogd -n       rs:main Q:Reg

SPID는 무엇을 의미합니까?
firo

8

시도해 볼 수 있습니다 top -H -p <pid>.
그러나 일부 유닉스 풍미 '-H'옵션은 top명령 에서 사용할 수 없습니다 .


2
나는 유닉스를 지원하지 않는 벤처 기업이다 -H. Linux는 GNU 도구 (를 포함하여 ps)를 사용하고 UNIX는 사용하지 않습니다. (이것은 물론 일반화입니다 ...)
Mei

1
"top -H -p <pid>"는 내가 원하는 것을 할 수있었습니다. 감사!
Wing Tang Wong

4
ps -H le <pid>

스레드를 프로세스로 표시해야합니다. 또한 멀티 스레드의 모든 스레드는 동일한 PID를 가져야합니다. Linux는 스레드 그룹을 만들어이를 수행합니다. 첫 번째 스레드는 그룹의 리더이며 해당 PID는 스레드 그룹의 tgid (thread groupID)입니다.

/ proc 파일 시스템을 사용하여 실제 PID 및 스레드 상태를 확인할 수 있습니다. 이를 달성하는 또 다른 방법은 ps를 사용하여 PID를 확인한 후 다음 명령을 실행하는 것입니다.

cat /proc/pid/status

그런 다음 스레드의 pid / tgid를 확인하고 다음 명령을 실행하십시오.

cat /proc/pid/task/threadid/status

1
top -H -p <process_id>

프로세스와 관련된 스레드 (예 : process_id)가 표시됩니다 [Ubuntu에서 사용됨. 일부 Linux 버전에서는 -H 옵션을 사용할 수 없습니다.]


0
ps huH  -p  pid | wc  -l 

위의 명령은 Java 프로세스의 경우 특정 프로세스 pid에 대해 실행중인 스레드 수를 보여줍니다.


0

나는 똑같은 것을 찾고 있었고 다음 bash 스크립트를 만들 수있었습니다.
이 작업은 여전히 ​​진행 중입니다. 스크립트를 개선함에 따라 이것을 업데이트 할 것입니다.
나는 유닉스 전문가가 아닙니다. 일부 전문가가 더 나은 품질로 2 줄로 작성할 수 있다고 확신하지만 내 의도는 다른 사람들에게 효과적인 솔루션을 제공하는 것입니다.

필터 및 프로세스 정보로 업데이트

#!/bin/bash

ps -ef --no-headers | while read line; do                 # for each process read the info (without headers)
   IFS='        ' read -r -a array <<< "$line"             # split info into array
   psResultStr="ps -p ${array[1]} -lfT |  wc -c"           # count how many threads per PID
   numThreads=$(eval $psResultStr)                         # trying to convert it to number so i can filter later
   if [ "$numThreads" -gt "1000" ]                          #only show process with 1K or more
   then
        printf "Number of threads for PID:${array[1]} Has $numThreads Threads.  Process info: "
              for ((i = 7; i < ${#array[@]}; ++i)); do       #Process info starts at idx 7
                                position=$(( $i + 1 ))  # bash arrays are 0-indexed
                                lineText=$(echo ${array[$i]}|tr -d '\n')   # remove any new lines
                                printf "%s" "$lineText"                     #output line item
                        done
                        printf "\n\n"
   fi
done
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.