it-swarm-ko.tech

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

Windows의 경우 Process Explorer 는 프로세스의 모든 스레드를 보여줍니다.

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


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

이 스크린 샷을보십시오

alt text

Linux에서 어떻게이 작업을 수행 할 수 있습니까? 감사합니다!

110
Lazer

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

스레드에 대한 정보를 표시 할 수있는 GUI 도구도 있습니다 (예 : qps (ps 주위의 간단한 GUI 랩퍼) 또는 conky (로트가있는 시스템 모니터) 구성 옵션).

각 프로세스에 대해 /proc/12345 어디 12345는 프로세스 ID입니다. 각 스레드에 대한 정보는 /proc/12345/task/67890 어디 67890는 커널 스레드 ID입니다. 여기서 ps, top 및 기타 도구가 정보를 얻습니다.

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가있는 스레드는 실제로 실시간 스레드입니다.

그러나

또 다른 옵션 인 true 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를 가지므로 동일한 프로세스에 있음을 알 수 있습니다.

67
Daniel Hill

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

Screenshot of htop

38
Michael Mrozek

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

/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가 있습니다.

22
user2496

공정 정보를 표시하는 두 가지 표준 도구는 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
15
Franklin Piat

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

8
Hemant
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
4
Ayush Goyal
top -H -p <process_id>

프로세스와 관련된 스레드가 나열됩니다 (예 : process_id) [Ubuntu에서 사용됩니다. -H 옵션은 일부 Linux 버전에서 사용할 수 없음]

1
parasrish
ps huH  -p  pid | wc  -l 

위의 명령은 특정 프로세스에 대한 실행 스레드 수를 보여줍니다. pid if Java 프로세스

0
ialiras

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

pdate 필터 및 프로세스 정보

#!/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
0
JavaSheriff