Windows의 경우 프로세스 탐색기 에 프로세스 아래의 모든 스레드가 표시됩니다.
특정 프로세스가 생성하는 모든 스레드에 대한 세부 정보를 표시 할 수있는 Linux 용 명령 줄 유틸리티가 있습니까?
나는 내가 더 분명하게해야한다고 생각한다. 프로세스 계층 구조를보고 싶지 않지만 특정 프로세스에서 생성 된 모든 스레드 목록
이 스크린 샷을보십시오
리눅스에서 어떻게 이것을 달성 할 수 있습니까? 감사!
Windows의 경우 프로세스 탐색기 에 프로세스 아래의 모든 스레드가 표시됩니다.
특정 프로세스가 생성하는 모든 스레드에 대한 세부 정보를 표시 할 수있는 Linux 용 명령 줄 유틸리티가 있습니까?
나는 내가 더 분명하게해야한다고 생각한다. 프로세스 계층 구조를보고 싶지 않지만 특정 프로세스에서 생성 된 모든 스레드 목록
이 스크린 샷을보십시오
리눅스에서 어떻게 이것을 달성 할 수 있습니까? 감사!
답변:
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
스레드를 표시하거나 숨기는 것 사이를 전환하는 방법 으로이 키를 언급 하지만 여전히 도움말 키로 작동합니다 .
h
도움말을 보려면 @AlexisWilke 소문자 , H
스레드를 표시하거나 숨기려면 대문자 입니다.
여기에있는 각 대답은 프로세스와 관련된 모든 스레드 목록을 지정한 것을 정확하게 제공하고 있음을 분명히하고 싶습니다. 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를 가지므로 동일한 프로세스에 있음을 알 수 있습니다.
sed
대신 사용 grep
하면 간단한 코드로 제목을 보존 할 수 있습니다.ps -e -T | sed -n '1p; /clementine/p;'
top의 curses 버전 인 htop 에는 각 프로세스의 모든 스레드를 트리보기로 표시하는 표시 옵션이 있습니다. 시작 htop
하고 누르면 다음과 같은 F5결과가 나타납니다.
다음을 사용하려고 할 수 있습니다.
/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가 있습니다.
두 개의 표준 툴 프로세스 정보가 보여 ps
및 top
(및 htop
/ 유사하다 개선 ).
노트:
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
시도해 볼 수 있습니다 top -H -p <pid>
.
그러나 일부 유닉스 풍미 '-H'옵션은 top
명령 에서 사용할 수 없습니다 .
-H
. Linux는 GNU 도구 (를 포함하여 ps
)를 사용하고 UNIX는 사용하지 않습니다. (이것은 물론 일반화입니다 ...)
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
나는 똑같은 것을 찾고 있었고 다음 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