Как получить (из терминала) общее количество потоков (на процесс и общее количество для всех процессов)

Я пытался погуглить, но не могу найти. Я ищу:

  1. количество потоков в процессе X

  2. общее количество запущенных потоков

32
задан 19 December 2011 в 22:24

5 ответов

Чтобы получить количество потоков для данного pid:

ps -o nlwp <pid>

Чтобы получить сумму всех потоков, запущенных в системе:

ps -eo nlwp | tail -n +2 | awk '{ num_threads += $1 } END { print num_threads }'
0
ответ дан 19 December 2011 в 22:24

Для определения количества потоков, выполняющих один процесс, вы можете посмотреть /proc/<pid>/status. Он должен перечислить количество потоков в качестве одного из полей.

0
ответ дан 19 December 2011 в 22:24

В Linux, в частности, есть один способ сделать это для каждого процесса:

#!/bin/sh
while read name val; do
    if [ "$name" = Threads: ]; then
        printf %s\\n "$val"
        return
    fi
done < /proc/"$1"/status

Затем вы можете вызвать этот скрипт с PID в качестве аргумента, и он сообщит о количестве потоков, принадлежащих этот процесс.

Чтобы подсчитать количество потоков для всей системы, этого достаточно:

#!/bin/sh
count() {
    printf %s\\n "$#"
}
count /proc/[0-9]*/task/[0-9]*

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

0
ответ дан 19 December 2011 в 22:24

Чтобы получить общее количество потоков (крошечных фрагментов процесса, выполняющегося одновременно), вы можете использовать команду ps -o nlwp <pid>. Она работает постоянно. Но если вы предпочитаете, чтобы увидеть это через файл. вам, вероятно, следует взглянуть на файлы, которые были созданы для каждого процесса системы. Там вы можете получить окончательные детали процесса. Для каждого процесса есть папка, созданная в /proc/<pid>, где вы также можете увидеть все остальные детали.

0
ответ дан 19 December 2011 в 22:24

Я основываю этот ответ на ps axms. ps является отличным инструментом для перечисления того, что работает.

Если вы хотите отфильтровать это по процессу, вы можете попробовать что-то вроде этого:

echo $(( `ps axms | grep firefox | wc -l`  - 1))

Мы вычтем 1, потому что grep будет отображаться в этом списке.

Для всех потоков в целом это должно работать:

echo $(( `ps axms | wc -l`  - 1))

На этот раз мы вычитаем один, потому что есть строка заголовка.

0
ответ дан 19 December 2011 в 22:24

Другие вопросы по тегам:

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