Jak uzyskać (z terminala) całkowitą liczbę wątków (na proces i ogółem dla wszystkich procesów)

32

Próbowałem google, ale nie mogę go znaleźć. Szukam:

  1. liczba wątków w procesie X

  2. całkowita liczba wątków aktualnie uruchomionych

NoSenseEtAl
źródło
stackoverflow.com/questions/268680/…
Ciro Santilli 3 改造 中心 法轮功 六四 事件

Odpowiedzi:

53

Aby uzyskać liczbę wątków dla danego pid:

ps -o nlwp <pid>

Aby uzyskać sumę wszystkich wątków działających w systemie:

ps -eo nlwp | tail -n +2 | awk '{ num_threads += $1 } END { print num_threads }'
jcollado
źródło
1
ps -o nlwp <pid>zwraca NLWP :), co to znaczy?
Siddharth
2
@ Siddharth NLWP oznacza liczbę lekkich procesów, czyli liczbę wątków.
jcollado
Możesz pominąć „NLWP” za pomocą „h” (ukryj nagłówki); tj .:ps h -o nlwp $pid
bufh
7

Aby znaleźć liczbę wątków uruchamiających pojedynczy proces, możesz przejrzeć /proc/<pid>/status. Powinien podać liczbę wątków jako jedno z pól.

anaken78
źródło
3

Opieram tę odpowiedź ps axms. psto świetne narzędzie do wyświetlania listy uruchomionych programów.

Jeśli chcesz filtrować to według procesu, możesz spróbować czegoś takiego:

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

Odejmujemy 1, ponieważ grep pojawi się na tej liście.

W przypadku wszystkich wątków powinno to działać:

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

Tym razem odejmujemy jeden, ponieważ istnieje wiersz nagłówka.

Oli
źródło
Jest to niedokładne, ponieważ zgłasza dodatkowy wątek na proces
Score_Under
1

Aby uzyskać całkowitą liczbę wątków (małe fragmenty procesu przebiegającego jednocześnie), możesz użyć polecenia ps -o nlwp <pid>Działa przez cały czas. Ale jeśli wolisz spróbować przejrzeć plik. prawdopodobnie powinieneś spojrzeć na pliki, które zostały utworzone dla każdego procesu systemu. Tam możesz uzyskać najdokładniejsze szczegóły procesu. Dla każdego procesu tworzony jest folder, w /proc/<pid>którym można zobaczyć wszystkie pozostałe szczegóły.

Laksith
źródło
1

W szczególności na Linuksie jest jeden sposób, aby to zrobić dla poszczególnych procesów:

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

Następnie możesz wywołać ten skrypt z PID jako argumentem, który zgłosi liczbę wątków posiadanych przez ten proces.

Aby uzyskać liczbę wątków dla całego systemu, wystarczy:

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

Podejścia te mogą wydawać się nieco niekonwencjonalne w mocno że opierają się one na powłoki funkcji, ale w zamian obaj są szybsze niż odpowiadające psi awkopartych podejścia na moim komputerze (nie tworząc jednocześnie dodatkowe wątki własnych rur). Pamiętaj, że powłoka uruchomiona w celu uruchomienia tych skryptów będzie miała własny wątek (lub więcej, jeśli używasz dziwnej implementacji).

Score_Under
źródło