Чи є можливість побачити деталі всіх потоків, які має процес в Linux?


101

Для Windows я думаю, що Провідник процесів показує всі потоки під час процесу.

Чи існує аналогічна утиліта командного рядка для Linux, яка може показати мені подробиці про всі потоки, які створює нерегулярний процес?


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

Дивіться цей скріншот

alt текст

Як цього можна досягти в Linux? Дякую!


Відповіді:


101

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

Також є інструменти графічного інтерфейсу, які можуть відображати інформацію про потоки, наприклад qps (простий GUI обгортки навколо ps) або conky (системний монітор з великою кількістю параметрів конфігурації).

Для кожного процесу доступно багато інформації, /proc/12345де 12345знаходиться ідентифікатор процесу. Інформація про кожен потік доступна /proc/12345/task/67890там, де 67890знаходиться ідентифікатор потоку ядра. Тут ps, topа також інші інструменти отримують інформацію.


Моя, htopздається, не показує мені ниток. Вони згадують Hключ як спосіб перемикання між показними та прихованими нитками, але він все ще працює як довідковий ключ ...
Alexis Wilke

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>, оскільки греп трохи нечіткий, якщо ви не ускладните його.
Томас Темель

4
Якщо ви використовуєте sedзамість grepвас, ви можете зберегти назву з тривіальним кодом:ps -e -T | sed -n '1p; /clementine/p;'
Май

thanx @Daniel ,, Мені цікаво, що. Чи можу я використовувати ці PID, щоб створити групу, як ми це робимо в багатоадресної ??
Лазар

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.


кожен процес має свій ідентифікатор процесу (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команди.


2
Я б ризикну, що жодна підтримка UNIX -H; Linux використовує інструменти GNU (у тому числі ps), а UNIX - ні. (Це, звичайно, узагальнення ...)
Май

1
"top -H -p <pid>" зміг робити те, що я хотів. Дякую!
Wing Tang Wong

4
ps -H le <pid>

Це відображатиме потоки як процеси. Також пам’ятайте, що всі потоки багатопотокових повинні мати однаковий PID. Linux робить це, створюючи групи потоків. Перший потік є лідером групи, і його PID буде tgid (нитка 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]


0
ps huH  -p  pid | wc  -l 

Вище команда показує кількість запущених потоку для конкретного процесу ПІД - регулятора , якщо для процесу Java


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.