Existe uma maneira de ver detalhes de todos os threads que um processo possui no Linux?

101

Para Windows, acho que o Process Explorer mostra todos os threads de um processo.

Existe um utilitário de linha de comando semelhante para Linux que pode me mostrar detalhes sobre todos os threads que um processo específico está gerando?


Eu acho que deveria ter me deixado mais claro. Eu não quero ver a hierarquia do processo, mas uma lista de todos os threads gerados por um processo específico

Veja esta captura de tela

texto alternativo

Como isso pode ser alcançado no Linux? Obrigado!

lazer
fonte

Respostas:

101

A ferramenta clássica topmostra processos por padrão, mas pode ser solicitada a mostrar threads com a Htecla pressionada ou a -Hopção de linha de comando. Também há htop , que é semelhante, topmas tem rolagem e cores; mostra todos os threads por padrão (mas isso pode ser desativado). pstambém tem algumas opções para mostrar tópicos, especialmente He -L.

Também existem ferramentas da GUI que podem mostrar informações sobre encadeamentos, por exemplo, qps (um simples invólucro da GUI ps) ou conky (um monitor do sistema com muitas opções de configuração).

Para cada processo, muitas informações estão disponíveis em /proc/12345onde 12345está o ID do processo. As informações sobre cada encadeamento estão disponíveis em /proc/12345/task/67890onde 67890está o ID do encadeamento do kernel. Este é o lugar onde ps, tope outras ferramentas de obter suas informações.

Gilles
fonte
Meu htopparece não me mostrar os tópicos. Eles mencionam a Hchave como uma maneira de alternar entre mostrar e ocultar threads, mas funciona como a chave de ajuda ainda ...
Alexis Wilke
1
@AlexisWilke Minúsculas hpara obter ajuda, maiúsculas Hpara mostrar / ocultar threads.
Gilles
58

Listando threads no Linux

Respostas atuais

Gostaria de deixar claro que cada resposta aqui está fornecendo exatamente o que você especificou, uma lista de todos os threads associados a um processo, isso pode não ser óbvio htop, pois, por padrão, lista todos os threads no sistema, não apenas o processo, mas top -H -p <pid>funciona melhor, por exemplo:

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

Como uma observação lateral, o encadeamento com -90é realmente um encadeamento em tempo real.

mas

Há também outra opção que é verdadeira CLI ps -e -T | grep <application name or pid>

  • -e mostra todos os processos
  • -T lista todos os tópicos
  • | canaliza a saída para o próximo comando
  • grep isso filtra o conteúdo

Aqui está um exemplo:

$ 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

Cada um deles tem o mesmo PID para que você saiba que eles estão no mesmo processo.

Daniel Hill
fonte
3
obrigado! SPID de quê?
Lazer
7
Observe que também há ps -Tp <pid>, pois o grep é um pouco confuso, a menos que você o torne mais complicado.
Thomas Themel 28/11/2010
4
Se você usar em sedvez de, greppoderá preservar o título com código trivial:ps -e -T | sed -n '1p; /clementine/p;'
Mei
1
@Lazer é difícil dizer o que significa, mas man topdiz que é um alias para LWPe TID, enquanto LWP = processo leve e TID = identificador de segmento.
Hi-Angel
1
O SPID é confusamente o ID do thread.
precisa saber é o seguinte
36

O htop , uma versão maldita do topo, tem uma opção de exibição para mostrar todos os threads de cada processo em uma exibição em árvore. Iniciar htope pressionar F5resultará em:

Captura de tela do htop

Michael Mrozek
fonte
21

Você pode tentar usar:

/usr/bin/pstree $PID

Por exemplo:

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

Cada thread tem seu próprio PID.

user2496
fonte
cada processo possui seu próprio ID de processo (pid). pstree não vai mostrar tópicos dentro dos processos
bjelli
13

As duas ferramentas padrão para mostrar informações de processo são pse top(e htopque são semelhantes / aprimoradas ).

Notas:

  • Muitos programas alteram o nome aparente dos threads para algo significativo; as ferramentas abaixo podem exibir o nome binário ou esse nome aparente (verifique o PID 1086 nos exemplos abaixo).
  • Nos exemplos abaixo, removi a maioria dos processos para manter a resposta curta.
  • Os exemplos de argumentos de comando abaixo são comuns. verifique a página de manual para opções alternativas ( ps -m, ps m, ps H...)

Visualização em tempo real de tudo ou 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

Visualização instantânea de todos os processos e threads, 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

Encadea informações de um 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: use uma opção -C commandou -p PIDpara selecionar o processo)

Detalha informações sobre threads de um processo, usando customizações 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
Franklin Piat
fonte
O que significa o SPID?
firo 16/06
8

Você pode tentar top -H -p <pid>.
Mas observe que em alguns sabores do Unix a opção '-H' não está disponível no topcomando.

Hemant
fonte
2
Eu arriscaria que nenhum UNIX suporta -H; O Linux usa ferramentas GNU (incluindo ps) e o UNIX não. (Isto é, naturalmente, uma generalização ...)
Mei
1
"top -H -p <pid>" foi capaz de fazer o que eu queria. Obrigado!
Wing Tang Wong
4
ps -H le <pid>

Isso deve exibir threads como processos. Lembre-se também de que todos os threads de um multithread devem ter o mesmo PID. O Linux faz isso criando grupos de threads. O primeiro thread é o líder do grupo e seu PID será tgid (thread groupID) do grupo de threads.

Você pode descobrir o PID real e o status dos threads usando o sistema de arquivos / proc. Outra maneira de conseguir isso é verificar o PID usando ps e, em seguida, execute o seguinte comando:

cat /proc/pid/status

Em seguida, verifique outros pids / tgid de threads e execute o seguinte comando:

cat /proc/pid/task/threadid/status
Ayush Goyal
fonte
1
top -H -p <process_id>

Isso listará os tópicos associados ao seu processo (por exemplo, process_id) [Usado no Ubuntu. Existe a possibilidade de a opção -H não estar disponível em alguns dos sabores do linux]

parasita
fonte
0
ps huH  -p  pid | wc  -l 

O comando acima mostra o número de encadeamentos em execução para o processo específico pid, se for para o processo java

ialiras
fonte
0

Eu estava procurando o mesmo e consegui criar o seguinte script bash.
Isso ainda está em andamento, atualizarei isso à medida que melhorar o script.
Não sou especialista em unix, tenho certeza de que algum especialista pode escrevê-lo em duas linhas, com uma qualidade melhor, mas minha intenção é fornecer uma solução funcional para os outros.

atualizar com informações de filtro e 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
user648026
fonte