มีวิธีดูรายละเอียดของเธรดทั้งหมดที่กระบวนการมีใน Linux หรือไม่?


101

สำหรับ Windows ฉันคิดว่าProcess Explorerจะแสดงเธรดทั้งหมดให้คุณทราบ

มียูทิลิตีบรรทัดคำสั่งที่คล้ายกันสำหรับ Linux ที่สามารถแสดงรายละเอียดเกี่ยวกับเธรดทั้งหมดที่กระบวนการเฉพาะวางไข่หรือไม่


ฉันคิดว่าฉันควรทำให้ตัวเองชัดเจนยิ่งขึ้น ฉันไม่ต้องการที่จะเห็นลำดับชั้นของกระบวนการ แต่รายการของกระทู้ทั้งหมดที่เกิดจากกระบวนการเฉพาะ

ดูภาพหน้าจอนี้

ข้อความแสดงแทน

วิธีนี้สามารถทำได้ใน Linux? ขอบคุณ!


คำตอบ:


101

เครื่องมือแบบดั้งเดิมtopแสดงกระบวนการตามค่าเริ่มต้น แต่สามารถบอกให้แสดงเธรดด้วยการHกดปุ่มหรือ-Hตัวเลือกบรรทัดคำสั่ง นอกจากนี้ยังมีฮ็อพซึ่งคล้ายกับtopแต่มีการเลื่อนและสี; มันจะแสดงกระทู้ทั้งหมดตามค่าเริ่มต้น (แต่สามารถปิดได้) psนอกจากนี้ยังมีไม่กี่ตัวเลือกที่จะแสดงกระทู้, โดยเฉพาะอย่างยิ่งและH-L

นอกจากนี้ยังมีเครื่องมือ GUI ที่สามารถแสดงข้อมูลเกี่ยวกับหัวข้อเช่นqps (ตัวห่อ GUI แบบง่าย ๆps) หรือconky (จอภาพระบบที่มีตัวเลือกการกำหนดค่ามากมาย)

สำหรับแต่ละกระบวนการข้อมูลจำนวนมากที่มีอยู่ใน/proc/12345สถานที่ที่12345เป็นกระบวนการ ID ข้อมูลเกี่ยวกับแต่ละเธรดมีอยู่ใน/proc/12345/task/67890ที่ซึ่ง67890ID เคอร์เนลเธรด นี่คือที่ps, topและเครื่องมืออื่น ๆ ได้รับข้อมูลของพวกเขา


ฉันhtopดูเหมือนจะไม่แสดงกระทู้ พวกเขาพูดถึงHกุญแจเป็นวิธีในการสลับระหว่างการแสดงและการซ่อนเธรด แต่มันทำงานเป็นปุ่มช่วยเหลือยัง ...
Alexis Wilke

1
@AlexisWilke ตัวพิมพ์เล็กhเพื่อขอความช่วยเหลือพิมพ์ใหญ่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
โปรดทราบว่านอกจากนี้ยังมี ps -Tp <pid> เนื่องจาก grep นั้นค่อนข้างคลุมเครือเว้นแต่คุณจะทำให้มันซับซ้อนมากขึ้น
โทมัสเทเมล

4
หากคุณใช้sedแทนคุณgrepสามารถรักษาชื่อด้วยรหัสเล็ก ๆ น้อย ๆ :ps -e -T | sed -n '1p; /clementine/p;'
เหม่ย

thanx @Daniel ,, ฉันอยากรู้ว่าฉันจะใช้ PID เหล่านี้เพื่อสร้างกลุ่มแบบที่เราทำในมัลติคาสต์ได้หรือไม่?
ลาซารัส

1
SPID เป็น ID เธรดที่สับสน
CMCDragonkai

36

htopเวอร์ชันบนสุดของ curses มีตัวเลือกการแสดงสำหรับการแสดงเธรดทั้งหมดสำหรับแต่ละกระบวนการในมุมมองแบบต้นไม้ การเริ่มต้น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

เครื่องมือมาตรฐานสองตัวเพื่อแสดงข้อมูลกระบวนการpsและtop( htopซึ่งมีความคล้ายคลึง / ปรับปรุง )

หมายเหตุ:

  • โปรแกรมจำนวนมากเปลี่ยนชื่อที่ปรากฏของเธรดให้เป็นสิ่งที่มีความหมายเครื่องมือด้านล่างสามารถแสดงชื่อไบนารีหรือชื่อที่ชัดเจน (ตรวจสอบ PID 1086 ในตัวอย่างด้านล่าง)
  • ในตัวอย่างด้านล่างฉันได้ลบกระบวนการส่วนใหญ่เพื่อให้คำตอบสั้น
  • ตัวอย่างอาร์กิวเมนต์คำสั่งด้านล่างเป็นตัวอย่างทั่วไป ตรวจสอบ manpage สำหรับตัวเลือกอื่น ( 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' บางรสชาติของ Unix ไม่สามารถใช้งานได้ในtopคำสั่ง


2
ฉันอยากจะเสี่ยงว่าไม่มียูนิกซ์รองรับ-H; Linux ใช้เครื่องมือ GNU (รวมถึงps) และ UNIX ไม่ได้ (แน่นอนว่าเป็นลักษณะทั่วไป ... )
เหม่ย

1
"top -H -p <pid>" สามารถทำสิ่งที่ฉันต้องการได้ ขอบคุณ!
Wing Tang Wong Wong

4
ps -H le <pid>

สิ่งนี้จะแสดงเธรดเป็นกระบวนการ นอกจากนี้โปรดจำไว้ว่าเธรดทั้งหมดของมัลติเธรดต้องมี PID เดียวกัน Linux ทำสิ่งนี้ได้โดยสร้างกลุ่มเธรด เธรดแรกคือผู้นำของกลุ่มและ PID ของมันจะเป็น tgid (thread groupID) ของกลุ่มเธรด

คุณสามารถค้นหา PID ที่แท้จริงและสถานะของเธรดโดยใช้ระบบไฟล์ / proc อีกวิธีหนึ่งในการบรรลุเป้าหมายนี้คือตรวจสอบ PID โดยใช้ ps จากนั้นเรียกใช้คำสั่งต่อไปนี้:

cat /proc/pid/status

จากนั้นตรวจสอบ pids / tgid เพิ่มเติมของเธรดและรันคำสั่งต่อไปนี้:

cat /proc/pid/task/threadid/status

1
top -H -p <process_id>

นี่จะแสดงรายการเธรดที่เกี่ยวข้องกับกระบวนการของคุณ (เช่น process_id) [ใช้บน Ubuntu มีความเป็นไปได้ที่ตัวเลือก -H จะไม่สามารถใช้ได้กับบางรสชาติของ linux]


0
ps huH  -p  pid | wc  -l 

คำสั่งด้านบนแสดงจำนวนเธรดที่กำลังรันสำหรับกระบวนการเฉพาะpidหากสำหรับกระบวนการ java


0

ฉันกำลังมองหาสิ่งเดียวกันและสามารถพบกับสคริปต์ทุบตีต่อไป
นี้ยังคงดำเนินการอยู่ฉันจะอัปเดตสิ่งนี้เมื่อฉันปรับปรุงสคริปต์
ฉันไม่ใช่ผู้เชี่ยวชาญยูนิกซ์ฉันแน่ใจว่าผู้เชี่ยวชาญบางคนสามารถเขียนได้ 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.