it-swarm.it

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

Per Windows, penso Process Explorer ti mostra tutti i thread nell'ambito di 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

alt text

Come può essere ottenuto in Linux? Grazie!

110
Lazer

Lo strumento classico top mostra i processi di default ma può essere detto di mostrare i thread con il tasto H o -H opzione da riga di comando. C'è anche htop , che è simile a top ma ha scorrimento e colori; mostra tutti i thread di default (ma può essere disattivato). ps ha anche alcune opzioni per mostrare i thread, in particolare H e -L.

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

Per ogni processo, molte informazioni sono disponibili in /proc/12345 dove 12345 è l'ID del processo. Le informazioni su ogni thread sono disponibili in /proc/12345/task/67890 dove 67890 è l'ID del thread del kernel. Qui è dove ps, top e altri strumenti ottengono le loro informazioni.

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 htop poiché, per impostazione predefinita, elenchi tutti i thread sul sistema, non solo il processo ma top -H -p <pid> funziona meglio ad 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 è 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.

67
Daniel Hill

htop , una versione maledetta di top, ha un'opzione di visualizzazione per mostrare tutti i thread per ogni processo in una vista ad albero. Avviare htop e premere F5 comporterà:

Screenshot of htop

38
Michael Mrozek

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.

22
user2496

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

Appunti:

  • Molti programmi cambiano il nome apparente dei thread in qualcosa di significativo, gli strumenti sottostanti 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. controlla la manpage per opzioni alternative (ps -m, ps m, ps H...)

Visualizzazione in tempo reale di tutto o processo, usando 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 tutto il processo e i thread, usando 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 le 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 una delle opzioni -C command, o -p PID per selezionare il processo)

Dettagli thread informazioni di un processo, usando ps personalizzato

$ 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
15
Franklin Piat

Puoi provare top -H -p <pid>.
Ma su alcuni tipi di Unix l'opzione '-H' non è disponibile nel comando top.

8
Hemant
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
4
Ayush Goyal
top -H -p <process_id>

Questo ti elencherà i thread, associati al tuo processo (cioè process_id) [Usato su Ubuntu. Esiste la possibilità che l'opzione -H non sia disponibile su alcune delle versioni di Linux]

1
parasrish
ps huH  -p  pid | wc  -l 

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

0
ialiras

Stavo cercando lo stesso, e sono stato in grado di elaborare il seguente script bash,
Sono ancora in corso lavori, 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 sul filtro e sul processo

#!/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
0
JavaSheriff