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

ОБ/МИН:

  • 'Стандартизированный' (не, что нет deb спецификации),
  • Используемый многими различными дистрибутивами (но пакеты от каждый не обязательно работает над другим),
  • IIRC позволяет зависимости от файлов, не только на пакетах

DEB:

  • Рост популярности
  • Позволяет рекомендации и предложения (возможно, более новый об/мин позволяет его также),

Вероятно, более важным вопросом является диспетчер пакетов (dpkg по сравнению с конфеткой по сравнению со способностью и т.д.), а не формат пакета (поскольку оба сопоставимы).

105
05.10.2010, 18:04
10 ответов

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

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

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

107
27.01.2020, 19:29

Список потоков в соответствии с 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, таким образом, Вы знаете, что они находятся в том же процессе.

63
27.01.2020, 19:29
  • 1
    Спасибо!, Что обозначает SPID? –  Lazer 24.08.2010, 09:06
  • 2
    Обратите внимание, что существует также PS-Tp <pid>, так как grep немного нечеток, если Вы не делаете его более сложным. –  Thomas Themel 28.11.2010, 07:58
  • 3
    Если Вы используете sed вместо grep можно сохранить заголовок с тривиальным кодом: ps -e -T | sed -n '1p; /clementine/p;' –  Mei 16.02.2012, 17:25
  • 4
    @Lazer, трудно сказать, что он обозначает, но man top говорит, что это - псевдоним к LWP и TID, тогда как LWP = легкий процесс и TID = распараллеливают идентификатор. –  Hi-Angel 03.08.2017, 21:19

htop, версия проклятий вершины, имеет параметр экрана для проявления всех потоков для каждого процесса в структурном виде. Запуск htop и нажатие F5 приведет к:

Screenshot of htop

36
27.01.2020, 19:29

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

8
27.01.2020, 19:29
  • 1
    я не рисковал бы тем никаким UNIX поддержки -H; Linux использует инструменты GNU (включая ps) и UNIX не делает. (Это - конечно, обобщение...) –  Mei 16.02.2012, 17:26
  • 2
    "вершина-H-p <pid>" смог сделать то, что я хотел.Спасибо! –  Wing Tang Wong 03.12.2014, 23:39
[117295] Можно попробовать использовать:[12106]Например:[12107]Каждый поток имеет свой PID.[117300].
22
27.01.2020, 19:29
top -H -p <process_id>

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

1
27.01.2020, 19:29

Два стандартных инструмента для показать информацию в процессе PS и Верхний HTOP , который аналогичен / улучшено ).

Примечания:

  • Многие программы изменяют очевидное имя нити к чему-то значимым, приведенные ниже инструменты могут либо отображать двоичные имена, либо это очевидное имя (проверьте PID 1086 в приведенных ниже примерах).
  • В приведенных ниже примерах я удалил большую часть процесса, чтобы оставить ответ.
  • Пример аргументов команды ниже являются общими. Проверьте ManPage для альтернативных вариантов ( 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 vehelf

$ 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
14
27.01.2020, 19:29
ps -H le <pid>

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

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

cat /proc/pid/status

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

cat /proc/pid/task/threadid/status
4
27.01.2020, 19:29
ps huH  -p  pid | wc  -l 

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

0
27.01.2020, 19:29

Я искал то же самое и смог придумать следующий сценарий 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
0
27.01.2020, 19:29

Теги

Похожие вопросы