Як отримати (з терміналу) загальну кількість потоків (за процес і загальну кількість для всіх процесів)


Відповіді:


53

Щоб отримати кількість потоків для заданого підпису:

ps -o nlwp <pid>

Щоб отримати суму всіх потоків, що працюють у системі:

ps -eo nlwp | tail -n +2 | awk '{ num_threads += $1 } END { print num_threads }'

1
ps -o nlwp <pid>повертає NLWP :), що це означає?
Сіддхарт

2
@Siddharth NLWP розшифровується як кількість LightWeight процесів, що є кількістю потоків.
jcollado

Ви можете придушити "NLWP" за допомогою "h" (приховати заголовки); тобто:ps h -o nlwp $pid
bufh

7

Щоб знайти кількість потоків, що виконують один процес, ви можете подивитися /proc/<pid>/status. У ньому повинно бути вказано кількість потоків як одне з полів.


3

Я грунтуюся на цій відповіді ps axms . psє прекрасним інструментом для переліку того, що працює.

Якщо ви хочете відфільтрувати це за допомогою процесу, ви можете спробувати щось подібне:

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

Ми віднімаємо 1, оскільки в цьому списку відображатиметься grep.

Для всіх потоків в цілому це має працювати:

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

Цього разу віднімаємо, бо є рядок заголовка.


Це неточно, оскільки повідомляє про додатковий потік за процес
Score_Under

1

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


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

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