Linuxでプロセスが持つすべてのスレッドの詳細を表示する方法はありますか?


101

Windowsの場合、Process Explorerプロセスの下のすべてのスレッドを表示すると思います。

特定のプロセスが生成するすべてのスレッドに関する詳細を表示できる、Linux用の同様のコマンドラインユーティリティはありますか?


自分をもっと明確にすべきだったと思う。プロセス階層を表示したくないが、特定のプロセスによって生成されたすべてのスレッドのリスト

このスクリーンショットを見る

代替テキスト

Linuxでこれをどのように実現できますか?ありがとう!


回答:


101

従来のツールtopはデフォルトでプロセスを表示しますが、Hキーを押すか-Hコマンドラインオプションでスレッドを表示するように指示できます。htopもありますが、これは似てtopいますが、スクロールと色があります。デフォルトですべてのスレッドを表示します(ただし、これはオフにすることができます)。psまた、スレッドを表示するいくつかのオプション、特にHとがあり-Lます。

スレッドに関する情報を表示できるGUIツールもあります。たとえば、qps(単純なGUIラッパーps)またはconky(多くの構成オプションを備えたシステムモニター)です。

各プロセスについて、プロセスID /proc/12345がどこにあるかについて多くの情報が利用可能です12345。各スレッドに関する情報はで提供されて/proc/12345/task/67890いる67890カーネルスレッドのIDです。これはどこでpstopそして他のツールは、その情報を取得します。


htopはスレッドを見せていないようです。彼らは、Hスレッドの表示と非表示を切り替える方法としてキーを挙げていますが、それはまだヘルプキーとして機能しています...
Alexis Wilke

1
@AlexisWilke hヘルプの場合は小文字、Hスレッドの表示/非表示の場合は大文字。
ジル

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は何の略ですか?
レーザー

7
ps -Tp <pid>もあることに注意してください。これは、複雑にしない限り、grepは少し曖昧だからです。
トーマスセメル

4
sed代わりに使用する場合grep、簡単なコードでタイトルを保存できますps -e -T | sed -n '1p; /clementine/p;'
Mei

thanx @Daniel 、、私は興味があります。これらのPIDを使用して、マルチキャストで行うようにグループを作成できますか?
ラザロ14年

1
SPIDは紛らわしいほどスレッドIDです。
CMCDragonkai

36

topのcursesバージョンであるhtopには、ツリービューで各プロセスのすべてのスレッドを表示するための表示オプションがあります。起動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

プロセス情報を表示するための2つの標準ツールはpsand top(およびhtop類似/ 改善)です。

ノート:

  • 多くのプログラムは、スレッドの見かけ上の名前を意味のあるものに変更します。以下のツールは、バイナリ名またはその見かけ上の名前を表示できます(以下の例のPID 1086を確認してください)。
  • 以下の例では、答えを短くするためにほとんどのプロセスを削除しました。
  • 以下のコマンド引数の例は一般的なものです。(別のオプションについてはmanページをチェックしps -mps mps 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の意味?
フィロ

8

試すことができtop -H -p <pid>ます。
ただし、一部のUnixフレーバーでは、topコマンドで「-H」オプションを使用できないことに注意してください。


2
UNIXがサポートしていないことを敢えてし-Hます。LinuxはGNUツール(を含むps)を使用し、UNIXは使用しません。(これは、もちろん、一般化です...)
メイ

1
「top -H -p <pid>」は、私が望んだことをすることができました。ありがとう!
ウイングタンウォン14

4
ps -H le <pid>

これにより、スレッドがプロセスとして表示されます。また、マルチスレッドのすべてのスレッドは同じPIDを持つ必要があることを忘れないでください。Linuxは、スレッドグループを作成することでこれを行います。最初のスレッドはグループのリーダーであり、そのPIDはスレッドグループのtgid(thread groupID)になります。

/ procファイルシステムを使用して、スレッドの実際のPIDとステータスを確認できます。これを実現する別の方法は、psを使用してPIDを確認し、次のコマンドを実行することです。

cat /proc/pid/status

次に、スレッドのpids / tgidをさらに確認し、次のコマンドを実行します。

cat /proc/pid/task/threadid/status

1
top -H -p <process_id>

これにより、プロセスに関連付けられたスレッド(つまりprocess_id)が一覧表示されます[Ubuntuで使用されます。一部のLinuxフレーバーでは、オプション-Hを使用できない可能性があります]


0
ps huH  -p  pid | wc  -l 

上記のコマンドは、Javaプロセスの場合、特定のプロセスpidの実行中のスレッドの数を表示します


0

私は同じものを探していて、次のbashスクリプトを思いつくことができました。
これはまだ進行中の作業です。スクリプトを改善するにつれてこれを更新します。
私はUnixの専門家ではありません。一部の専門家は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.