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

32

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

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

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

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

Ответы:

53

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

ps -o nlwp <pid>

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

ps -eo nlwp | tail -n +2 | awk '{ num_threads += $1 } END { print num_threads }'
jcollado
источник
1
ps -o nlwp <pid>возвращает NLWP :), что это значит?
Сиддхарт
2
@Siddharth NLWP означает Число процессов LightWeight, которое является числом потоков.
Jcollado
Вы можете подавить «NLWP» с помощью «h» (скрыть заголовки); а именно:ps h -o nlwp $pid
bufh
8

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

anaken78
источник
3

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

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

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

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

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

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

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

Оли
источник
Это неточно, так как сообщает о дополнительных
потоках для
1

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

Laksith
источник
1

В 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основанные на моей основе подходы на моей машине (но также не создают собственных дополнительных потоков для каналов). Имейте в виду, что оболочка, запускаемая для запуска этих сценариев, будет иметь собственный поток (или более, если вы используете странную реализацию).

Score_Under
источник