¿Hay alguna manera de ver detalles de todos los hilos que tiene un proceso en Linux?

101

Para Windows, creo que Process Explorer te muestra todos los hilos de un proceso.

¿Existe una utilidad de línea de comandos similar para Linux que pueda mostrarme detalles sobre todos los hilos que genera un proceso en particular?


Creo que debería haberme dejado más claro. No quiero ver la jerarquía del proceso, sino una lista de todos los hilos generados por un proceso en particular

Ver esta captura de pantalla

texto alternativo

¿Cómo se puede lograr esto en Linux? ¡Gracias!

Lazer
fuente
stackoverflow.com/questions/268680/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Respuestas:

101

La herramienta clásica topmuestra los procesos por defecto, pero se le puede pedir que muestre hilos con la Htecla presionada o la -Hopción de línea de comando. También hay htop , que es similar toppero tiene desplazamiento y colores; muestra todos los subprocesos de forma predeterminada (pero esto se puede desactivar). psTambién tiene algunas opciones para mostrar hilos, especialmente Hy -L.

También hay herramientas de GUI que pueden mostrar información sobre subprocesos, por ejemplo, qps (un simple envoltorio de GUI ps) o conky (un monitor de sistema con muchas opciones de configuración).

Para cada proceso, hay mucha información disponible sobre /proc/12345dónde 12345está la ID del proceso. La información sobre cada subproceso está disponible en /proc/12345/task/67890dónde 67890está la ID del subproceso del núcleo. Aquí es donde ps, topy otras herramientas de obtener su información.

Gilles
fuente
Mi htopno parece mostrarme los hilos. Mencionan la Hclave como una forma de cambiar entre mostrar y ocultar hilos, pero funciona como la clave de Ayuda aún ...
Alexis Wilke
1
@AlexisWilke Minúscula hpara ayuda, mayúscula Hpara mostrar / ocultar hilos.
Gilles
58

Listado de hilos bajo Linux

Actual proporcionar respuestas

Me gustaría dejar en claro que cada respuesta aquí le proporciona exactamente lo que ha especificado, una lista de todos los hilos asociados con un proceso, esto puede no ser obvio htopya que, de forma predeterminada, enumera todos los hilos en el sistema, no solo el proceso, sino que top -H -p <pid>funciona mejor, por ejemplo:

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 nota al margen, el hilo con -90es en realidad un hilo en tiempo real.

pero

También hay otra opción que es verdadera CLI ps -e -T | grep <application name or pid>

  • -e muestra todos los procesos
  • -T enumera todos los hilos
  • | canaliza la salida al siguiente comando
  • grep esto filtra los contenidos

Aquí hay un ejemplo:

$ 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 uno de estos tiene el mismo PID para que sepa que están en el mismo proceso.

Daniel Hill
fuente
3
¡Gracias! ¿Qué significa SPID?
Lazer
77
Tenga en cuenta que también hay ps -Tp <pid>, ya que grep es un poco confuso a menos que lo haga más complicado.
Thomas Themel el
44
Si usa en sedlugar de greppuede preservar el título con un código trivial:ps -e -T | sed -n '1p; /clementine/p;'
Mei
Gracias @ Daniel, tengo curiosidad de que. ¿Puedo usar estos PID para hacer un grupo como lo hacemos en multidifusión?
Lázaro
1
El SPID es confusamente la ID del hilo.
CMCDragonkai
36

htop , una versión maldita de top, tiene una opción de visualización para mostrar todos los hilos de cada proceso en una vista de árbol. Comenzar htopy presionar F5resultará en:

Captura de pantalla de htop

Michael Mrozek
fuente
21

Puedes intentar usar:

/usr/bin/pstree $PID

Por ejemplo:

# 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 hilo tiene su propio PID.

user2496
fuente
cada proceso tiene su propia identificación de proceso (pid). pstree no le mostrará hilos dentro de los procesos
bjelli
13

Las dos herramientas estándar para mostrar información de proceso son psy top(y htopque es similar / mejorada ).

Notas:

  • Muchos programas cambian el nombre aparente de los hilos a algo significativo, las herramientas a continuación pueden mostrar el nombre binario o ese nombre aparente (ver PID 1086 en los ejemplos a continuación).
  • En los ejemplos a continuación, he eliminado la mayoría de los procesos para mantener la respuesta breve.
  • Los ejemplos de argumentos de comando a continuación son comunes. compruebe la página del manual de opciones alternativas ( ps -m, ps m, ps H...)

Vista en tiempo real de todo o proceso, 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

Vista instantánea de todos los procesos y subprocesos, utilizando 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

Subprocesos de información de un proceso, utilizando 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 cualquiera de las opciones -C commando -p PIDpara seleccionar el proceso)

Detalles de información de subprocesos de un proceso, utilizando 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
fuente
¿Qué significa SPID?
Firo
8

Puedes intentarlo top -H -p <pid>.
Pero tenga en cuenta que en algunos sabores de Unix, la opción '-H' no está disponible en el topcomando.

Hemant
fuente
2
Me aventuraría a que ningún UNIX sea compatible -H; Linux usa herramientas GNU (incluidas ps) y UNIX no. (Esto es, por supuesto, una generalización ...)
Mei
1
"top -H -p <pid>" pudo hacer lo que quería. ¡Gracias!
Wing Tang Wong
4
ps -H le <pid>

Esto mostrará subprocesos como procesos. Recuerde también que todos los subprocesos de un subproceso múltiple deben tener el mismo PID. Linux hace esto haciendo grupos de hilos. El primer subproceso es el líder del grupo y su PID será tgid (thread groupID) del grupo de subprocesos.

Puede averiguar el PID real y el estado de los hilos utilizando el sistema de archivos / proc. Otra forma de lograr esto es verificar el PID usando ps, luego ejecutar el siguiente comando:

cat /proc/pid/status

Luego verifique más pids / tgid de hilos y ejecute el siguiente comando:

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

Esto le mostrará una lista de los hilos asociados con su proceso (es decir, process_id) [Usado en Ubuntu. Existe la posibilidad de que la opción -H no esté disponible en algunos de los sabores de Linux]

parasitar
fuente
0
ps huH  -p  pid | wc  -l 

El comando anterior muestra el número de subprocesos en ejecución para un proceso específico pid if para un proceso java

ialiras
fuente
0

Estaba buscando lo mismo y pude encontrar el siguiente script bash.
Esto todavía está en progreso, lo actualizaré a medida que mejore el script.
No soy un experto en Unix, estoy seguro de que algún experto puede escribirlo en 2 líneas, con una mejor calidad, pero mi intención es proporcionar una solución de trabajo para otros.

actualizar con información de filtro y proceso

#!/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
usuario648026
fuente