Para Windows, acho que 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
Como isso pode ser alcançado no Linux? Obrigado!
A ferramenta clássica top
mostra processos por padrão, mas pode ser solicitada a mostrar threads com a tecla H
pressionada ou -H
opção de linha de comando. Há também htop , que é semelhante a top
, mas tem rolagem e cores; mostra todos os threads por padrão (mas isso pode ser desativado). ps
também possui algumas opções para mostrar threads, especialmente H
e -L
.
Também existem ferramentas de GUI que podem mostrar informações sobre threads, por exemplo qps (um wrapper de GUI simples em torno de ps
) ou conky (um monitor de sistema com lotes de opções de configuração).
Para cada processo, muitas informações estão disponíveis em /proc/12345
Onde 12345
é o ID do processo. As informações sobre cada thread estão disponíveis em /proc/12345/task/67890
Onde 67890
é o ID do thread do kernel. É aqui que ps
, top
e outras ferramentas obtêm suas informações.
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 em 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 observação lateral, o segmento com -90
é realmente um encadeamento em tempo real.
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 comandogrep
isso filtra o conteúdoAqui 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.
htop , uma versão amaldiçoada de top, possui uma opção de exibição para mostrar todos os threads de cada processo em uma visualização em árvore. Iniciando htop
e pressionando F5 vai resultar em:
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.
As duas ferramentas padrão para mostrar informações do processo são ps
e top
(e htop
que são similares/ aprimoradas ).
Notas:
ps -m
, ps m
, ps H
...)Visualização em tempo real de todo 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 todo o processo 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 command
ou -p PID
para selecionar o processo)
Detalhes encadea informações de um processo, usando o personalizado 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
Podes tentar top -H -p <pid>
.
Mas observe que em alguns sabores do Unix a opção '-H' não está disponível no comando top
.
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
top -H -p <process_id>
Isso listará os tópicos associados ao seu processo (ou seja, process_id) [Usado no Ubuntu. Existe a possibilidade de a opção -H não estar disponível em alguns dos sabores do linux]
ps huH -p pid | wc -l
O comando acima mostra o número de encadeamentos em execução para um processo específico pid if for Java process
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.
atualização 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