Existe-t-il un moyen de voir les détails de tous les threads qu’un processus a sous Linux?


101

Pour Windows, je pense que Process Explorer vous montre tous les threads d’un processus.

Existe-t-il un utilitaire de ligne de commande similaire pour Linux pouvant afficher des détails sur tous les threads générés par un processus donné?


Je pense que j'aurais dû être plus clair. Je ne veux pas voir la hiérarchie des processus, mais une liste de tous les threads générés par un processus particulier

Voir cette capture d'écran

texte alternatif

Comment cela peut-il être réalisé sous Linux? Merci!


Réponses:


101

L'outil classique topaffiche les processus par défaut, mais il est possible d'indiquer les discussions à l'aide de la Htouche de fonction ou -Hde l'option de ligne de commande. Il y a aussi htop , qui est semblable à topmais a le défilement et les couleurs; il montre tous les threads par défaut (mais cela peut être désactivé). psa également quelques options pour afficher les discussions, en particulier Het -L.

Il existe également des outils d'interface graphique pouvant afficher des informations sur les threads, par exemple qps (un simple wrapper d'interface graphique ps) ou conky (un moniteur système avec de nombreuses options de configuration).

Pour chaque processus, de nombreuses informations sont disponibles, /proc/12345où se 12345trouve l'ID du processus. Des informations sur chaque thread sont disponibles, /proc/12345/task/67890où se 67890trouve l'ID de thread du noyau. C'est là ps, topet d' autres outils obtenir leurs informations.


Mon htopne semble pas me montrer les fils. Ils mentionnent la Hclé comme moyen de permuter entre afficher et masquer les discussions, mais cela fonctionne toujours comme clé d' aide ...
Alexis Wilke

1
@AlexisWilke Minuscules hpour obtenir de l'aide, en majuscules Hpour afficher / masquer les discussions.
Gilles

58

Liste des discussions sous Linux

Réponses actuelles

Je voudrais préciser que chaque réponse ici vous fournit exactement ce que vous avez spécifié, une liste de tous les threads associés à un processus, cela peut ne pas être évident htopcar, par défaut, répertorie tous les threads du système, pas seulement le processus mais top -H -p <pid>fonctionne mieux par exemple:

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

En remarque, le thread avec -90est en fait un thread en temps réel.

mais

Il y a aussi une autre option qui est vraie CLI ps -e -T | grep <application name or pid>

  • -e montre tous les processus
  • -T liste tous les sujets
  • | dirige la sortie vers la commande suivante
  • grep cela filtre le contenu

Voici un exemple:

$ 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

Chacun de ceux-ci a le même PID afin que vous sachiez qu'ils sont dans le même processus.


3
Merci! Que signifie SPID?
Lazer

7
Notez qu'il existe aussi ps -Tp <pid>, car le grep est un peu flou à moins que vous ne le rendiez plus compliqué.
Thomas Themel

4
Si vous utilisez à la sedplace de grepvous pouvez conserver le titre avec un code trivial:ps -e -T | sed -n '1p; /clementine/p;'
Mei

1
@Lazer, il est difficile de dire ce que cela signifie, mais man topdit que c'est un alias pour LWPet TID, alors que LWP = processus léger et TID = identificateur de fil.
Hi-Angel

1
Le SPID est source de confusion, l'ID de thread.
CMCDragonkai

36

htop , une version de top curses, dispose d'une option d'affichage pour afficher tous les threads de chaque processus dans une vue arborescente. En commençant htopet en appuyant, vous F5obtiendrez:

Capture d'écran de htop


21

Vous pouvez essayer d'utiliser:

/usr/bin/pstree $PID

Par exemple:

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

Chaque fil a son propre PID.


chaque processus a son propre identifiant de processus (pid). pstree ne vous montrera pas les discussions à l'intérieur des processus
bjelli

13

Les deux outils standard pour afficher les informations de processus sont pset top(et htopqui est similaire / amélioré ).

Remarques:

  • Beaucoup de programmes changent le nom apparent des threads en quelque chose de significatif, les outils ci-dessous peuvent afficher le nom binaire ou ce nom apparent (vérifiez le PID 1086 dans les exemples ci-dessous).
  • Dans les exemples ci-dessous, j'ai supprimé la plupart des processus pour que la réponse soit courte.
  • Les exemples d'arguments de commande ci-dessous sont les plus courants. vérifier la page de manuel pour d' autres options ( ps -m, ps m, ps H...)

Vue en temps réel de tout ou processus, en utilisant 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

Visualisation instantanée de tous les processus et threads, en utilisant 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

Informations de fil d'un processus, en utilisant 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

(note: utilisez l'une des options -C commandou -p PIDsélectionnez le processus)

Détails des informations de thread d'un processus, en utilisant custom 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

Que signifie SPID?
FIRO

8

Tu peux essayer top -H -p <pid>.
Mais notez que sur certaines versions d'Unix, l'option -H n'est pas disponible en topcommande.


2
J'oserais dire qu'aucun support UNIX ne prend en charge -H; Linux utilise les outils GNU (y compris ps), contrairement à UNIX. (Ceci est, bien sûr, une généralisation ...)
Mei

1
"top -H -p <pid>" a été capable de faire ce que je voulais. Merci!
Wing Tang Wong

4
ps -H le <pid>

Cela doit afficher les threads en tant que processus. Rappelez-vous également que tous les threads d'un multi-thread doivent avoir le même PID. Linux le fait en créant des groupes de threads. Le premier thread est le leader du groupe et son PID sera tgid (thread groupID) du groupe de thread.

Vous pouvez connaître le PID réel et le statut des threads en utilisant le système de fichiers / proc. Pour cela, vous pouvez également vérifier le PID en utilisant ps, puis exécuter la commande suivante:

cat /proc/pid/status

Ensuite, vérifiez les pids / tgid des threads et exécutez la commande suivante:

cat /proc/pid/task/threadid/status

1
top -H -p <process_id>

Cela vous donnera la liste des threads associés à votre processus (ie process_id) [Utilisé sous Ubuntu. Il est possible que l'option -H ne soit pas disponible sur certaines versions de Linux.]


0
ps huH  -p  pid | wc  -l 

La commande ci-dessus indique le nombre de threads en cours d'exécution pour un pid de processus spécifique si pour un processus java


0

Je cherchais la même chose et pouvais proposer le script bash suivant.
C’est toujours un travail en cours, je le mettrai à jour à mesure que j’améliorerai le script.
Je ne suis pas un expert Unix, je suis sûr que certains experts peuvent l'écrire en 2 lignes, avec une meilleure qualité, mais mon intention est de fournir une solution de travail aux autres.

mise à jour avec filtre et information de processus

#!/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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.