Есть ли способ увидеть детали всех потоков, которые есть у процесса в Linux?

101

Я думаю, что для Windows Process Explorer показывает все потоки процесса.

Существует ли аналогичная утилита командной строки для Linux, которая может показать мне подробности обо всех потоках, которые порождает конкретный процесс?


Я думаю, что я должен был сделать себя более ясным. Я не хочу видеть иерархию процесса, но список всех потоков, порожденных конкретным процессом

Смотрите этот скриншот

альтернативный текст

Как это может быть достигнуто в Linux? Спасибо!

Lazer
источник
stackoverflow.com/questions/268680/…
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件

Ответы:

101

Классический инструмент topпоказывает процессы по умолчанию, но может быть показан показ потоков с Hнажатием клавиши или параметром -Hкомандной строки. Существует также htop , который похож на topпрокрутку и цвета; по умолчанию отображаются все потоки (но это можно отключить). psтакже есть несколько вариантов отображения тем, особенно Hи -L.

Существуют также инструменты с графическим интерфейсом, которые могут отображать информацию о потоках, например, qps (простая оболочка для графического интерфейса пользователя ps) или conky (системный монитор с большим количеством параметров конфигурации).

Для каждого процесса доступно много информации о том, /proc/12345где 12345находится идентификатор процесса. Информация о каждом потоке доступна /proc/12345/task/67890там, где 67890находится идентификатор потока ядра. Здесь ps, topа также другие инструменты получают информацию.

жилль
источник
Мой, htopкажется, не показывает мне темы. Они упоминают Hключ как способ переключения между отображением и скрытием потоков, но он все еще работает как ключ справки ...
Алексис Уилк
1
@AlexisWilke Нижний регистр hдля справки, верхний регистр, Hчтобы показать / скрыть темы.
Жиль
58

Перечисление потоков под Linux

Текущие дают ответы

Я хотел бы прояснить, что каждый ответ здесь предоставляет вам именно то, что вы указали, список всех потоков, связанных с процессом, это может быть неочевидным, htopпоскольку по умолчанию в нем перечислены все потоки в системе, не только процесс, но top -H -p <pid>работает лучше, например:

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

Как примечание, поток с -90фактически является потоком в реальном времени.

но

Есть также еще один вариант, который является истинным CLI ps -e -T | grep <application name or pid>

  • -e показывает все процессы
  • -T перечисляет все темы
  • | направляет вывод в следующую команду
  • grep это фильтрует содержимое

Вот пример:

$ 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

Каждый из них имеет одинаковый PID, поэтому вы знаете, что они находятся в одном и том же процессе.

Дэниэл Хилл
источник
3
Спасибо! Что означает SPID?
Лазер
7
Обратите внимание, что есть также ps -Tp <pid>, поскольку grep немного нечеткий, если вы не усложните его.
Томас Фемел
4
Если вы используете sedвместо grepвас, вы можете сохранить заголовок с тривиальным кодом:ps -e -T | sed -n '1p; /clementine/p;'
Mei
1
@Lazer Трудно сказать, что он обозначает, но man topговорит, что это псевдоним для LWPand TID, тогда как LWP = облегченный процесс, а TID = идентификатор потока.
Привет, Ангел,
1
SPID - это путанный идентификатор потока.
CMCDragonkai
36

htop , верхняя версия curses, имеет опцию отображения для отображения всех потоков для каждого процесса в виде дерева. Запуск htopи нажатие F5приведет к:

Скриншот htop

Михаил Мрозек
источник
21

Вы можете попробовать использовать:

/usr/bin/pstree $PID

Например:

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

Каждый поток имеет свой собственный PID.

user2496
источник
каждый процесс имеет свой собственный идентификатор процесса (pid). pstree не будет показывать вам потоки внутри процессов
bjelli
13

Два стандартных инструмента для отображения информации о процессе: psи tophtopкоторый похож / улучшен ).

Примечания:

  • Многие программы изменяют видимое имя потоков на что-то осмысленное, инструменты ниже могут отображать двоичное имя или это очевидное имя (см. PID 1086 в примерах ниже).
  • В приведенных ниже примерах я удалил большую часть процесса, чтобы сократить ответ.
  • Ниже приведен пример аргументов команды. проверьте страницу руководства для альтернативных вариантов ( ps -m, ps m, ps H...)

Просмотр в реальном времени всего или процесса, используя 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

Мгновенный просмотр всех процессов и потоков, используя 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

Потоки информации о процессе, используя 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

(примечание: используйте либо опцию -C command, либо -p PIDвыбрать процесс)

Детализирует потоки информации о процессе, используя пользовательские 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
Франклин Пиат
источник
Что значит SPID?
FIRO
8

Вы можете попробовать top -H -p <pid>.
Но учтите, что для некоторых разновидностей Unix опция '-H' недоступна в topкоманде.

Hemant
источник
2
Я бы рискнул, что никакой UNIX не поддерживает -H; Linux использует инструменты GNU (в том числе ps), а UNIX - нет. (Это, конечно, обобщение ...)
Мэй
1
"top -H -p <pid>" смог сделать то, что я хотел. Спасибо!
Крыло Тан Вонг
4
ps -H le <pid>

Это должно отображать темы как процессы. Также помните, что все потоки многопоточных должны иметь одинаковый PID. Linux делает это путем создания групп потоков. Первый поток является лидером группы, а его PID будет tgid (thread groupID) группы потоков.

Вы можете узнать фактический PID и состояние потоков с помощью файловой системы / proc. Другой способ добиться этого - проверить PID с помощью ps, а затем выполнить следующую команду:

cat /proc/pid/status

Затем проверьте дополнительные pids / tgid потоков и выполните следующую команду:

cat /proc/pid/task/threadid/status
Аюш Гоял
источник
1
top -H -p <process_id>

Это перечислит вам потоки, связанные с вашим процессом (т.е. process_id) [Используется в Ubuntu. Существует вероятность того, что опция -H недоступна для некоторых разновидностей Linux]

parasrish
источник
0
ps huH  -p  pid | wc  -l 

Приведенная выше команда показывает количество запущенных потоков для определенного процесса pid, если для процесса Java

ialiras
источник
0

Я искал то же самое и смог придумать следующий сценарий bash:
это все еще в стадии разработки, я буду обновлять его по мере улучшения сценария.
Я не эксперт по Unix, я уверен, что один эксперт может написать это в 2 строки с лучшим качеством, но я намерен предоставить работающее решение для других.

обновлять фильтром и обрабатывать информацию

#!/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
источник