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


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 }'

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.


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.


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.


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).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.