Gibt es eine Möglichkeit, Details zu allen Threads eines Prozesses in Linux anzuzeigen?


101

Unter Windows werden im Process Explorer alle Threads eines Prozesses angezeigt.

Gibt es ein ähnliches Befehlszeilenprogramm für Linux, das mir Details zu allen Threads anzeigt, die ein bestimmter Prozess erzeugt?


Ich denke, ich hätte mich klarer ausdrücken sollen. Ich möchte nicht die Prozesshierarchie sehen, sondern eine Liste aller Threads, die von einem bestimmten Prozess erzeugt wurden

Siehe diesen Screenshot

Alt-Text

Wie kann dies unter Linux erreicht werden? Vielen Dank!


Antworten:


101

Das klassische Tool topzeigt standardmäßig Prozesse an, kann jedoch angewiesen werden, Threads mit der HTastendruck- oder -HBefehlszeilenoption anzuzeigen. Es gibt auch htop , das ähnlich ist, topaber Bildlauf und Farben hat; Standardmäßig werden alle Threads angezeigt (dies kann jedoch deaktiviert werden). psAußerdem gibt es einige Optionen zum Anzeigen von Threads, insbesondere Hund -L.

Es gibt auch GUI-Tools, die Informationen zu Threads anzeigen können, z. B. qps (ein einfacher GUI-Wrapper ps) oder conky (ein Systemmonitor mit vielen Konfigurationsoptionen).

Für jeden Prozess sind viele Informationen verfügbar, in /proc/12345denen 12345sich die Prozess-ID befindet. Informationen zu den einzelnen Threads in /proc/12345/task/67890denen 67890ist der Kernel - Thread - ID. Dies ist , wo ps, topund andere Werkzeuge erhalten ihre Informationen.


Meine htopscheint mir die Fäden nicht zu zeigen. Sie erwähnen den HSchlüssel als eine Möglichkeit, zwischen dem Anzeigen und Ausblenden von Threads zu wechseln, aber er funktioniert immer noch als Hilfetaste ...
Alexis Wilke

1
@AlexisWilke Kleinbuchstaben hfür Hilfe, Großbuchstaben Hzum Ein- / Ausblenden von Threads.
Gilles

58

Auflisten von Threads unter Linux

Aktuelle Antworten liefern

Ich möchte klarstellen, dass jede Antwort hier genau das angibt, was Sie angegeben haben, eine Liste aller mit einem Prozess verknüpften Threads. Dies ist möglicherweise nicht offensichtlich, htopda standardmäßig alle Threads auf dem System aufgelistet werden. nicht nur der Prozess aber top -H -p <pid>besser funktioniert zum Beispiel:

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

Als Randnotiz ist der Thread mit -90tatsächlich ein Echtzeit-Thread.

aber

Es gibt auch eine andere Option, die wahres CLI ist ps -e -T | grep <application name or pid>

  • -e zeigt alle Prozesse
  • -T listet alle Threads auf
  • | leitet die Ausgabe an den nächsten Befehl weiter
  • grep Dies filtert den Inhalt

Hier ist ein Beispiel:

$ 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

Jeder von diesen hat die gleiche PID, damit Sie wissen, dass sie sich im selben Prozess befinden.


3
Vielen Dank! Wofür steht SPID?
Lazer

7
Beachten Sie, dass es auch ps -Tp <pid> gibt, da das grep etwas unscharf ist, es sei denn, Sie machen es komplizierter.
Thomas Themel

4
Wenn Sie sedanstelle von verwenden grep, können Sie den Titel mit Trivialcode beibehalten:ps -e -T | sed -n '1p; /clementine/p;'
Mei

Danke @Daniel ,, Ich bin neugierig, dass .Kann ich diese PIDs verwenden, um eine Gruppe zu bilden, wie wir es in Multicast tun?
Lazarus

1
Die SPID ist verwirrenderweise die Thread-ID.
CMCDragonkai

36

htop , eine verfluchte Version von top, verfügt über eine Anzeigeoption zum Anzeigen aller Threads für jeden Prozess in einer Baumansicht. Das Starten htopund Drücken von F5führt zu:

Screenshot von htop


21

Sie können versuchen, Folgendes zu verwenden:

/usr/bin/pstree $PID

Zum Beispiel:

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

Jeder Thread hat eine eigene PID.


Jeder Prozess hat eine eigene Prozess-ID (pid). pstree zeigt Ihnen keine Threads in den Prozessen
Bjelli

13

Die zwei Standardwerkzeuge zum Anzeigen von Prozessinformationen sind psund top(und htopwelche ähnlich / verbessert sind ).

Anmerkungen:

  • Viele Programme ändern den scheinbaren Namen der Threads in einen aussagekräftigen Namen. Die folgenden Tools können entweder den binären Namen oder diesen scheinbaren Namen anzeigen (überprüfen Sie PID 1086 in den folgenden Beispielen).
  • In den folgenden Beispielen habe ich die meisten Prozesse entfernt, um die Antwort kurz zu halten.
  • Das folgende Beispiel für Befehlsargumente ist häufig. überprüfen Sie die Man - Page für alternative Optionen ( ps -m, ps m, ps H...)

Echtzeit-Ansicht aller oder des Prozesses mit 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

Sofortige Ansicht aller Prozesse und Threads mit 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

Fädelt Informationen eines Prozesses mit 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

(Hinweis: Verwenden Sie eine der Optionen -C commandoder -p PID, um den Prozess auszuwählen.)

Führt Thread-Informationen eines Prozesses mithilfe von benutzerdefinierten Threads aus 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

Was bedeutet SPID?
16.

8

Sie können es versuchen top -H -p <pid>.
Bitte beachten Sie jedoch auf einige Option Unix - Varianten ‚-H‘ in nicht verfügbar ist topBefehl.


2
Ich würde es wagen, dass kein UNIX unterstützt -H; Linux verwendet GNU-Tools (einschließlich ps) und UNIX nicht. (Dies ist natürlich eine Verallgemeinerung ...)
Mei

1
"top -H -p <pid>" konnte tun, was ich wollte. Vielen Dank!
Wing Tang Wong

4
ps -H le <pid>

Dies soll Threads als Prozesse anzeigen. Denken Sie auch daran, dass alle Threads eines Multithreads dieselbe PID haben müssen. Linux tut dies, indem es Thread-Gruppen erstellt. Der erste Thread ist der Anführer der Gruppe und seine PID ist die tgid (Thread-Gruppen-ID) der Thread-Gruppe.

Sie können die aktuelle PID und den Status von Threads mithilfe des Dateisystems / proc ermitteln. Eine andere Möglichkeit, dies zu erreichen, besteht darin, die PID mit ps zu überprüfen und dann den folgenden Befehl auszuführen:

cat /proc/pid/status

Dann überprüfe weitere pids / tgid von Threads und führe folgenden Befehl aus:

cat /proc/pid/task/threadid/status

1
top -H -p <process_id>

Hier werden die Threads aufgelistet, die Ihrem Prozess zugeordnet sind (z. B. process_id). [Wird unter Ubuntu verwendet. Es besteht die Möglichkeit, dass die Option -H auf einigen Linux-Versionen nicht verfügbar ist.]


0
ps huH  -p  pid | wc  -l 

Der obige Befehl zeigt die Anzahl der ausgeführten Threads für eine bestimmte Prozess- PID für einen Java-Prozess an


0

Ich habe dasselbe gesucht und konnte das folgende Bash-Skript entwickeln.
Dies ist noch in Arbeit. Ich werde es aktualisieren, wenn ich das Skript verbessere.
Ich bin kein Unix-Experte, ich bin sicher, dass ein Experte es in zwei Zeilen mit einer besseren Qualität schreiben kann, aber meine Absicht ist es, eine funktionierende Lösung für andere bereitzustellen.

Update mit Filter- und Prozessinformationen

#!/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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.