Windows의 경우 Process Explorer 는 프로세스의 모든 스레드를 보여줍니다.
특정 프로세스가 생성하는 모든 스레드에 대한 세부 정보를 표시 할 수있는 Linux 용 명령 줄 유틸리티가 있습니까?
나는 내가 더 분명하게해야한다고 생각한다. 프로세스 계층 구조를보고 싶지는 않지만 특정 프로세스에서 생성 된 모든 스레드 목록
이 스크린 샷을보십시오
Linux에서 어떻게이 작업을 수행 할 수 있습니까? 감사합니다!
기본 도구 인 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
및 기타 도구가 정보를 얻습니다.
여기에있는 각 대답은 프로세스와 관련된 모든 스레드 목록을 지정했는지 정확하게 알려주고 싶습니다. 기본적으로 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를 가지므로 동일한 프로세스에 있음을 알 수 있습니다.
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>
.
그러나 top
명령에서 일부 유닉스 풍미 '-H'옵션을 사용할 수 없습니다.
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
top -H -p <process_id>
프로세스와 관련된 스레드가 나열됩니다 (예 : process_id) [Ubuntu에서 사용됩니다. -H 옵션은 일부 Linux 버전에서 사용할 수 없음]
ps huH -p pid | wc -l
위의 명령은 특정 프로세스에 대한 실행 스레드 수를 보여줍니다. pid if Java 프로세스
나는 똑같은 것을 찾고 있었고 다음과 같은 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