C'è un modo per vedere i dettagli di tutti i thread che un processo ha in Linux?


101

Per Windows, penso che Process Explorer ti mostri tutti i thread in un processo.

Esiste un'utilità della riga di comando simile per Linux che può mostrarmi i dettagli su tutti i thread che sta generando un particolare processo?


Penso che avrei dovuto farmi più chiaro. Non voglio vedere la gerarchia del processo, ma un elenco di tutti i thread generati da un particolare processo

Vedi questo screenshot

testo alternativo

Come si può ottenere questo in Linux? Grazie!


Risposte:


101

Lo strumento classico topmostra i processi per impostazione predefinita ma può essere detto di mostrare i thread con la Hpressione del tasto o l' -Hopzione della riga di comando. C'è anche htop , che è simile topma ha scorrimento e colori; mostra tutti i thread di default (ma questo può essere disattivato). psha anche alcune opzioni per mostrare le discussioni, in particolare He -L.

Esistono anche strumenti della GUI che possono mostrare informazioni sui thread, ad esempio qps (un semplice wrapper della GUI in giro ps) o conky (un monitor di sistema con molte opzioni di configurazione).

Per ogni processo, sono disponibili molte informazioni su /proc/12345dove si 12345trova l'ID del processo. Informazioni su ciascun thread sono disponibili in /proc/12345/task/67890dove si 67890trova l'ID thread del kernel. È qui ps, tope altri strumenti di ottenere le loro informazioni.


Il mio htopnon sembra mostrarmi i fili. Citano la Hchiave come un modo per scambiare tra mostrare e nascondere le discussioni, ma funziona ancora come la chiave di aiuto ...
Alexis Wilke,

1
@AlexisWilke Minuscolo hper aiuto, maiuscolo Hper mostrare / nascondere i thread.
Gilles,

58

Elenco dei thread in Linux

Current fornisce risposte

Vorrei chiarire che ogni risposta qui ti fornisce esattamente ciò che hai specificato, un elenco di tutti i thread associati a un processo, questo potrebbe non essere ovvio in htopquanto, per impostazione predefinita, elenca tutti i thread sul sistema, non solo il processo ma top -H -p <pid>funziona meglio per esempio:

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

Come nota a margine, il thread con -90è in realtà un thread in tempo reale.

ma

C'è anche un'altra opzione che è la vera CLI ps -e -T | grep <application name or pid>

  • -e mostra tutti i processi
  • -T elenca tutti i thread
  • | invia l'output al comando successivo
  • grep questo filtra i contenuti

Ecco un esempio:

$ 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

Ognuno di questi ha lo stesso PID, quindi sai che sono nello stesso processo.


3
Grazie! Cosa significa SPID?
Lazer,

7
Nota che c'è anche ps -Tp <pid>, dal momento che grep è un po 'sfocato a meno che tu non lo renda più complicato.
Thomas Themel,

4
Se usi al sedposto greptuo puoi conservare il titolo con un codice banale:ps -e -T | sed -n '1p; /clementine/p;'
Mei,

1
@Lazer è difficile dire ciò che rappresenta, ma man topdice che è un alias LWPe TID, mentre LWP = processo leggero e TID = identificatore di thread.
Ciao Angelo

1
Lo SPID è l'ID thread confuso.
CMCDragonkai,

36

htop , una versione maledetta di top, ha un'opzione di visualizzazione per mostrare tutti i thread per ogni processo in una vista ad albero. L'avvio htope la pressione F5comporteranno:

Schermata di htop


21

Puoi provare a usare:

/usr/bin/pstree $PID

Per esempio:

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

Ogni thread ha il proprio PID.


ogni processo ha il suo ID di processo (pid). pstree non ti mostrerà discussioni all'interno dei processi
bjelli,

13

I due strumenti standard per mostrare le informazioni di processo sono pse top(e htopche è simile / migliorato ).

Appunti:

  • Molti programmi cambiano il nome apparente dei thread in qualcosa di significativo, gli strumenti seguenti possono visualizzare il nome binario o quel nome apparente (controllare PID 1086 negli esempi seguenti).
  • Negli esempi seguenti, ho rimosso la maggior parte del processo per mantenere la risposta breve.
  • Gli argomenti di comando riportati di seguito sono quelli comuni. controllare la pagina di manuale per le opzioni alternative ( ps -m, ps m, ps H...)

Visualizzazione in tempo reale di tutto o processo, utilizzando 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

Visualizzazione istantanea di tutti i processi e thread, utilizzando 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

Discussioni informazioni di un processo, usando 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

(nota: utilizzare entrambe le opzioni -C commando -p PIDper selezionare il processo)

Informazioni dettagliate sui thread di un processo, usando personalizzato 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

Cosa significa SPID?
firo,

8

Si può provare top -H -p <pid>.
Ma si noti che su alcuni tipi di Unix l'opzione '-H' non è disponibile nel topcomando.


2
Mi azzarderei a sostenere che nessun UNIX -H; Linux usa strumenti GNU (incluso ps) e UNIX no. (Questa è, ovviamente, una generalizzazione ...)
Mei,

1
"top -H -p <pid>" è stato in grado di fare quello che volevo. Grazie!
Wing Tang Wong,

4
ps -H le <pid>

Questo mostrerà i thread come processi. Ricorda inoltre che tutti i thread di un multi-thread devono avere lo stesso PID. Linux lo fa creando gruppi di thread. Il primo thread è il leader del gruppo e il suo PID sarà tgid (thread groupID) del gruppo di thread.

È possibile scoprire il PID e lo stato effettivi dei thread utilizzando il file system / proc. Un altro modo per ottenere ciò è controllare il PID usando ps, quindi eseguire il comando seguente:

cat /proc/pid/status

Quindi controlla ulteriori pid / tgid di thread ed esegui il seguente comando:

cat /proc/pid/task/threadid/status

1
top -H -p <process_id>

Questo ti elencherà i thread, associati al tuo processo (ie process_id) [Usato su Ubuntu. È possibile che l'opzione -H non sia disponibile su alcuni dei gusti di Linux]


0
ps huH  -p  pid | wc  -l 

Il comando sopra mostra il numero di thread in esecuzione per pid di processo specifico se per processo java


0

Stavo cercando lo stesso, ed è stato in grado di elaborare il seguente script bash,
questo è ancora in fase di elaborazione , lo aggiornerò mentre migliorerò lo script.
Non sono un esperto di Unix, sono certo che un esperto può scriverlo in 2 righe, con una qualità migliore, ma la mia intenzione è di fornire una soluzione funzionante per gli altri.

aggiornamento con informazioni sui filtri e sui processi

#!/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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.