Pour Windows, je pense que Process Explorer vous montre tous les threads sous un processus.
Existe-t-il un utilitaire de ligne de commande similaire pour Linux qui peut me montrer des détails sur tous les threads qu'un processus particulier génère?
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 engendrés par un processus particulier
Voir cette capture d'écran
Comment cela peut-il être réalisé sous Linux? Merci!
L'outil classique top
affiche les processus par défaut mais peut être invité à afficher les threads avec la touche H
ou -H
option de ligne de commande. Il y a aussi htop , qui est similaire à top
mais a un défilement et des couleurs; il affiche tous les threads par défaut (mais cela peut être désactivé). ps
dispose également de quelques options pour afficher les threads, en particulier H
et -L
.
Il existe également des outils GUI qui peuvent afficher des informations sur les threads, par exemple qps (un simple wrapper GUI autour de ps
) ou conky (un moniteur système avec beaucoup d'options de configuration).
Pour chaque processus, de nombreuses informations sont disponibles dans /proc/12345
où 12345
est l'ID du processus. Des informations sur chaque thread sont disponibles dans /proc/12345/task/67890
où 67890
est l'ID de thread du noyau. C'est là que ps
, top
et d'autres outils obtiennent leurs informations.
Je tiens à 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 dans htop
car, par défaut, il 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 fil avec -90
est en fait un thread en temps réel.
Il y a aussi une autre option qui est vraie CLI ps -e -T | grep <application name or pid>
-e
affiche tous les processus-T
répertorie toutes les discussions|
redirige la sortie vers la commande suivantegrep
cela filtre le contenuVoici 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 d'eux a le même PID, vous savez donc qu'ils sont dans le même processus.
htop , une version curses de top, a une option d'affichage pour afficher tous les threads de chaque processus dans une arborescence. Démarrer htop
et appuyer sur F5 aura pour résultat:
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 thread a son propre PID.
Les deux outils standard pour afficher les informations de processus sont ps
et top
(et htop
qui est similaire/ amélioré ).
Remarques:
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
Vue 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
Threads d'informations 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
(remarque: utilisez l'une des options -C command
, ou -p PID
pour sélectionner le processus)
Détaille les informations sur les threads d'un processus, en utilisant 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
Tu peux essayer top -H -p <pid>
.
Mais veuillez noter que l'option -H de certaines versions d'Unix n'est pas disponible dans la commande top
.
ps -H le <pid>
Cela doit afficher les threads en tant que processus. Souvenez-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 threads.
Vous pouvez découvrir le PID réel et l'état des threads en utilisant le système de fichiers/proc. Une autre façon d'y parvenir est de vérifier le PID à l'aide de ps, puis d'exécuter la commande suivante:
cat /proc/pid/status
Vérifiez ensuite d'autres pids/tgid de threads et exécutez la commande suivante:
cat /proc/pid/task/threadid/status
top -H -p <process_id>
Cela vous listera les threads, associés à votre processus (c'est-à-dire process_id) [Utilisé sur Ubuntu. Il est possible que l'option -H ne soit pas disponible sur certaines des saveurs linux]
ps huH -p pid | wc -l
La commande ci-dessus montre le nombre de threads en cours d'exécution pour un processus spécifique pid si pour Java process
Je cherchais la même chose, et j'ai pu trouver le script bash suivant,
Ce travail est toujours en cours, je le mettrai à jour à mesure que j'améliorerai le script.
Je ne suis pas un expert Unix, je suis sûr qu'un expert peut l'écrire en 2 lignes, avec une meilleure qualité, mais mon intention est de fournir une solution de travail pour les autres.
mise à jour avec filtre et informations sur le 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