Có cách nào để xem chi tiết về tất cả các luồng mà một tiến trình có trong Linux không?


101

Đối với Windows, tôi nghĩ Process Explorer hiển thị cho bạn tất cả các luồng trong một quy trình.

Có một tiện ích dòng lệnh tương tự cho Linux có thể cho tôi biết chi tiết về tất cả các luồng mà một quá trình cụ thể đang sinh ra không?


Tôi nghĩ rằng tôi nên làm cho mình rõ ràng hơn. Tôi không muốn xem quy trình xử lý, nhưng một danh sách tất cả các chủ đề được sinh ra bởi một quy trình cụ thể

Xem ảnh chụp màn hình này

văn bản thay thế

Làm thế nào điều này có thể đạt được trong Linux? Cảm ơn!


Câu trả lời:


101

Công cụ cổ điển tophiển thị các quy trình theo mặc định nhưng có thể được yêu cầu hiển thị các luồng với tùy chọn Hnhấn phím hoặc -Hdòng lệnh. Ngoài ra còn có htop , tương tự topnhưng có cuộn và màu sắc; nó hiển thị tất cả các chủ đề theo mặc định (nhưng điều này có thể được tắt). pscũng có một vài tùy chọn để hiển thị chủ đề, đặc biệt H-L.

Ngoài ra còn có các công cụ GUI có thể hiển thị thông tin về các luồng, ví dụ qps (trình bao bọc GUI đơn giản xung quanh ps) hoặc conky (màn hình hệ thống có nhiều tùy chọn cấu hình).

Đối với mỗi quy trình, rất nhiều thông tin có sẵn ở /proc/12345đâu 12345là ID quy trình. Thông tin về mỗi luồng có sẵn trong /proc/12345/task/67890đó 67890là ID luồng nhân. Đây là nơi ps, topvà các công cụ khác có được thông tin của họ.


Tôi htopdường như không cho tôi thấy các chủ đề. Họ đề cập đến Hkhóa như một cách để trao đổi giữa hiển thị và ẩn các chuỗi, nhưng nó vẫn hoạt động như khóa Trợ giúp vẫn ...
Alexis Wilke

1
@AlexisWilke Chữ thường hđể được trợ giúp, chữ hoa Hđể hiển thị / ẩn chủ đề.
Gilles

58

Liệt kê các chủ đề trong Linux

Hiện tại cung cấp câu trả lời

Tôi muốn làm rõ rằng mỗi câu trả lời ở đây sẽ cung cấp cho bạn chính xác những gì bạn đã chỉ định, một danh sách tất cả các luồng liên quan đến một quy trình htop, theo mặc định, điều này có thể không rõ ràng vì nó liệt kê tất cả các luồng trên hệ thống, không chỉ là quá trình mà còn top -H -p <pid>hoạt động tốt hơn chẳng hạn:

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

Như một lưu ý phụ, chủ đề với -90 thực sự là một chủ đề thời gian thực.

nhưng

Ngoài ra còn có một lựa chọn khác đó là CLI thật ps -e -T | grep <application name or pid>

  • -e hiển thị tất cả các quy trình
  • -T liệt kê tất cả các chủ đề
  • | dẫn đầu ra cho lệnh tiếp theo
  • grep cái này lọc nội dung

Đây là một ví dụ:

$ 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

Mỗi trong số này có cùng một PID để bạn biết rằng chúng đang trong cùng một quy trình.


3
cảm ơn! SPID có nghĩa là gì?
Lazer

7
Lưu ý rằng cũng có ps -Tp <pid>, vì grep hơi mờ trừ khi bạn làm cho nó phức tạp hơn.
Thomas Themel

4
Nếu bạn sử dụng sedthay vì grepbạn có thể giữ tiêu đề bằng mã tầm thường:ps -e -T | sed -n '1p; /clementine/p;'
Mei

thanx @Daniel ,, Tôi tò mò rằng. Tôi có thể sử dụng các PID này để tạo một nhóm như chúng ta làm trong multicast không ??
lazarus

1
SPID gây nhầm lẫn là ID luồng.
CMCDragonkai

36

htop , một phiên bản nguyền rủa của đỉnh, có một tùy chọn hiển thị để hiển thị tất cả các luồng cho mỗi quá trình trong chế độ xem dạng cây. Bắt đầu htopvà nhấn F5sẽ dẫn đến:

Ảnh chụp màn hình của htop


21

Bạn có thể thử sử dụng:

/usr/bin/pstree $PID

Ví dụ:

# 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)
                ...

Mỗi luồng có PID riêng.


mỗi tiến trình có id tiến trình riêng (pid). pstree sẽ không hiển thị cho bạn các chủ đề bên trong các quy trình
bjelli

13

Hai công cụ tiêu chuẩn để hiển thị thông tin quy trình là pstop(và htoptương tự / được cải thiện ).

Ghi chú:

  • Nhiều chương trình thay đổi tên rõ ràng của các chủ đề thành một cái gì đó có ý nghĩa, các công cụ dưới đây có thể hiển thị tên nhị phân hoặc tên rõ ràng đó (kiểm tra PID 1086 trong các ví dụ bên dưới).
  • Trong các ví dụ dưới đây, tôi đã loại bỏ hầu hết quá trình để giữ câu trả lời ngắn gọn.
  • Ví dụ đối số lệnh dưới đây là những cái phổ biến. kiểm tra manpage cho các tùy chọn thay thế ( ps -m, ps m, ps H...)

Chế độ xem thời gian thực của tất cả hoặc quá trình, sử dụng 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

Xem ngay lập tức tất cả quá trình và chủ đề, sử dụng 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

Thông tin chủ đề của một quá trình, sử dụng 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

(lưu ý: sử dụng một trong hai tùy chọn -C commandhoặc -p PIDđể chọn quy trình)

Chi tiết chủ đề thông tin của một quá trình, sử dụng tùy chỉnh 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 có nghĩa là gì?
firo

8

Bạn có thể thử top -H -p <pid>.
Nhưng xin lưu ý về một số tùy chọn '-H' hương vị Unix không có sẵn trong toplệnh.


2
Tôi sẽ mạo hiểm rằng không có UNIX hỗ trợ -H; Linux sử dụng các công cụ GNU (bao gồm ps) và UNIX thì không. (Tất nhiên, đây là một sự khái quát hóa ...)
Mei

1
"top -H -p <pid>" đã có thể làm những gì tôi muốn. Cảm ơn!
Cánh Tang Wong

4
ps -H le <pid>

Điều này sẽ hiển thị chủ đề như các quá trình. Cũng cần nhớ rằng tất cả các luồng của đa luồng phải có cùng một PID. Linux thực hiện điều này bằng cách tạo các nhóm luồng. Chủ đề đầu tiên là người lãnh đạo của nhóm và PID của nó sẽ là tgid (chủ đề nhómID) của nhóm chủ đề.

Bạn có thể tìm hiểu thực tế về PID và trạng thái của các luồng bằng cách sử dụng / Proc hệ thống tệp. Một cách khác để đạt được điều này là kiểm tra PID bằng cách sử dụng ps, sau đó chạy lệnh sau:

cat /proc/pid/status

Sau đó kiểm tra thêm pids / tgid của chủ đề và chạy lệnh sau:

cat /proc/pid/task/threadid/status

1
top -H -p <process_id>

Điều này sẽ liệt kê cho bạn các chủ đề, được liên kết với quy trình của bạn (ví dụ process_id) [Được sử dụng trên Ubuntu. Có khả năng tùy chọn -H không khả dụng trên một số hương vị linux]


0
ps huH  -p  pid | wc  -l 

Lệnh trên cho thấy số luồng đang chạy cho pid process cụ thể nếu cho java process


0

Tôi đã tìm kiếm tương tự, và đã có thể đưa ra kịch bản bash sau đây,
Điều này vẫn đang được tiến hành, tôi sẽ cập nhật điều này khi tôi cải thiện kịch bản.
Tôi không phải là chuyên gia unix, tôi chắc chắn một số chuyên gia có thể viết nó thành 2 dòng, với chất lượng tốt hơn, nhưng ý định của tôi là cung cấp một giải pháp làm việc cho những người khác.

cập nhật với bộ lọc và xử lý thông tin

#!/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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.