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

<p>я думаю, что для windows <a href="http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx">process explorer</a> показывает все потоки в процессе.</p><p>существует ли аналогичная утилита командной строки для linux, которая может показать мне подробности обо всех потоках, которые порождает конкретный процесс?</p><hr><p>я думаю, что я должен был сделать себя более ясным. <strong> я не хочу видеть иерархию процессов, но список всех потоков, порожденных конкретным процессом </strong></p><p>смотрите этот скриншот</p><p><img src="https://i.stack.imgur.com/zfcgv.png" alt="alt text"></p><p><strong> как этого можно добиться в linux? </strong> спасибо!</p>

<p>классический инструмент <code>top</code> показывает процессы по умолчанию, но можно указать отображение потоков при нажатии клавиши <code>h</code> или <code>-h</code> опция командной строки. существует также <a href="http://htop.sourceforge.net">htop</a> , который похож на <code>top</code>, но имеет прокрутку и цвета; по умолчанию отображаются все потоки (но это можно отключить). <code>ps</code> также имеет несколько опций для отображения потоков, особенно <code>h</code> и <code>-l</code>.</p><p>существуют также инструменты gui, которые могут отображать информацию о потоках, например <a href="http://qps.kldp.net/projects/qps">qps</a> (простая оболочка gui вокруг <code>ps</code>) или <a href="http://sourceforge.net/projects/conky/">conky</a> (системный монитор с большим количеством вариантов конфигурации).</p><p>для каждого процесса много информации доступно в <code>/proc/12345</code> где <code>12345</code> это идентификатор процесса. информация о каждой теме доступна в <code>/proc/12345/task/67890</code> где <code>67890</code> - это идентификатор потока ядра. именно здесь <code>ps</code>, <code>top</code> и другие инструменты получают свою информацию.</p>

<h2>перечисление потоков под linux</h2><h3>текущие дают ответы</h3><p>я хотел бы прояснить, что каждый ответ здесь предоставляет вам именно то, что вы указали, список всех потоков, связанных с процессом, это может быть неочевидно в <code>htop</code>, так как в нем по умолчанию перечислены все потоки в системе, не только процесс, но <code>top -h -p <pid></code> лучше работает, например:</p><pre><code>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 </code></pre><p>как примечание стороны, нить с <code>-90</code> на самом деле поток в реальном времени.</p><h3>но</h3><p>есть также еще один вариант, который является истинным cli <code>ps -e -t | grep <application name or pid></code></p><ul> <li><code>-e</code> показывает все процессы</li> <li><code>-t</code> перечисляет все темы</li> <li><code>|</code> направляет вывод в следующую команду</li> <li><code>grep</code> это фильтрует содержимое</li> </ul><p>вот пример:</p><pre><code>$ 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, поэтому вы знаете, что они находятся в одном и том же процессе.

 <a href="http://htop.sourceforge.net/">htop , версия top с curses, имеет опцию отображения для отображения всех потоков для каждого процесса в виде дерева. начиная htop и нажимая f5 приведет к:<img src="https://i.stack.imgur.com/a29uw.png" alt="screenshot of htop">

вы можете попробовать использовать:/usr/bin/pstree $pid </code></pre><p>например:</p><pre><code># 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) ... </code></pre><p>каждый поток имеет свой собственный pid.</p>

<p>два стандартных инструмента для отображения информации о процессе: <code>ps</code> и <code>top</code> (и <code>htop</code>, что похоже/<em> улучшено</em>).</p><p>ноты:</p><ul> <li>многие программы меняют видимое имя потоков на что-то осмысленное, инструменты ниже могут отображать двоичное имя или это очевидное имя (см. pid 1086 в приведенных ниже примерах).</li> <li>в приведенных ниже примерах я удалил большую часть процесса, чтобы сократить ответ.</li> <li>ниже приведен пример аргументов команды. проверьте man-страницу для альтернативных опций (<code>ps -m</code>, <code>ps m</code>, <code>ps h</code>...)</li> </ul><p><strong>просмотр в реальном времени всего или процесса, используя <code>top -h</code></strong></p><pre><code>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 </code></pre><p><strong>мгновенный просмотр всех процессов и потоков, используя <code>ps -elf</code></strong></p><pre><code>$ 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 <strong>потоки информации о процессе, используя ps -t</strong>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 чтобы выбрать процесс)<strong>подробная информация о потоках процесса, используя пользовательские ps</strong>$ 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 </code></pre>

<p>ты можешь попробовать <code>top -h -p <pid></code>.<br> но обратите внимание, что для некоторых разновидностей unix опция '-h' недоступна в команде <code>top</code>.</p>

<pre><code>ps -h le <pid> </code></pre><p>это должно отображать потоки как процессы. также помните, что все потоки многопоточных должны иметь одинаковый pid. linux делает это путем создания групп потоков. первый поток является лидером группы, а его pid будет tgid (thread groupid) группы потоков.</p><p>вы можете узнать фактический pid и состояние потоков с помощью файловой системы/proc. другой способ добиться этого - проверить pid с помощью ps, а затем выполнить следующую команду:</p><pre><code>cat /proc/pid/status </code></pre><p>затем проверьте дополнительные pids/tgid потоков и выполните следующую команду:</p><pre><code>cat /proc/pid/task/threadid/status </code></pre>

<pre><code>top -h -p <process\_id> </code></pre><p>это перечислит вам потоки, связанные с вашим процессом (т.е. process\_id) <em>[используется в ubuntu. существует вероятность, что опция -h недоступна в некоторых разновидностях linux]</em></p>

<pre><code>ps huh -p pid | wc -l </code></pre><p>вышеприведенная команда показывает номер запущенного потока для определенного процесса <em>pid</em> if for java process)</p>

<p>я искал то же самое и смог придумать следующий скрипт bash,<br> эта работа еще не завершена, я буду обновлять ее по мере улучшения сценария.<br> я не эксперт по unix, я уверен, что некоторые эксперты могут написать это в 2 строки с лучшим качеством, но я намерен предоставить работающее решение для других.</p><p><strong>обновление</strong> с фильтром и информацией о процессе</p><pre><code>#!/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 </code></pre>