Czy istnieje sposób, aby zobaczyć szczegóły wszystkich wątków, które proces ma w systemie Linux?

101

W przypadku systemu Windows myślę, że Process Explorer pokazuje wszystkie wątki w procesie.

Czy istnieje podobne narzędzie wiersza poleceń dla Linuksa, które może pokazywać mi szczegóły dotyczące wszystkich wątków pojawiających się w danym procesie?


Myślę, że powinienem był wyrazić się lepiej. Nie chcę widzieć hierarchii procesu, ale listę wszystkich wątków spawnowanych przez dany proces

Zobacz ten zrzut ekranu

alternatywny tekst

Jak można to osiągnąć w systemie Linux? Dzięki!

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

Odpowiedzi:

101

Klasyczne narzędzie topdomyślnie pokazuje procesy, ale można nakazać im wyświetlanie wątków za pomocą Hnaciśnięcia klawisza lub -Hopcji wiersza polecenia. Istnieje również htop , który jest podobny do, topale ma przewijanie i kolory; domyślnie pokazuje wszystkie wątki (ale można to wyłączyć). psma również kilka opcji wyświetlania wątków, zwłaszcza Hi -L.

Istnieją również narzędzia GUI, które mogą wyświetlać informacje o wątkach, na przykład qps (proste opakowanie GUI ps) lub conky (monitor systemu z wieloma opcjami konfiguracji).

Dla każdego procesu dostępnych jest wiele informacji o tym, /proc/12345gdzie 12345jest identyfikator procesu. Informacje o każdym wątku są dostępne w /proc/12345/task/67890miejscu, w którym 67890znajduje się identyfikator wątku jądra. To tam ps, topi inne narzędzia zdobywają informacje.

Gilles
źródło
Mój htopwydaje się nie pokazywać mi wątków. Wspominają o Hkluczu jako sposobie przełączania między pokazywaniem a ukrywaniem wątków, ale nadal działa jako klucz Pomoc ...
Alexis Wilke,
1
@AlexisWilke Małe litery, haby uzyskać pomoc, wielkie litery, Haby pokazać / ukryć wątki.
Gilles
58

Wyświetlanie wątków w systemie Linux

Obecne udzielają odpowiedzi

Chciałbym wyjaśnić, że każda odpowiedź tutaj zawiera dokładnie to, co podałeś, listę wszystkich wątków powiązanych z procesem, może to nie być oczywiste htop, ponieważ domyślnie zawiera listę wszystkich wątków w systemie, nie tylko proces, ale top -H -p <pid>działa lepiej na przykład:

top - 00:03:29 up 3 days, 14:49,  5 users,  load average: 0.76, 0.33, 0.18
Tasks:  18 total,   0 running,  18 sleeping,   0 stopped,   0 zombie
Cpu(s): 22.6%us,  5.7%sy,  4.2%ni, 66.2%id,  0.8%wa,  0.5%hi,  0.1%si,  0.0%st
Mem:   2063948k total,  1937744k used,   126204k free,   528256k buffers
Swap:  1052220k total,    11628k used,  1040592k free,   539684k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
30170 daniel    20   0  371m 140m 107m S 10.0  7.0   0:31.37 source:src
30066 daniel   -90   0  371m 140m 107m S  2.0  7.0   0:07.87 clementine
30046 daniel    20   0  371m 140m 107m S  0.0  7.0   0:32.05 clementine
30049 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.03 clementine
30050 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.31 clementine
30051 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.00 clementine
30052 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.00 clementine
30053 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.00 clementine
30054 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.03 clementine
30055 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.00 clementine
30056 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.00 clementine
30057 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.04 clementine
30058 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.00 clementine
30060 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.16 clementine
30061 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.00 clementine
30062 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.00 clementine
30064 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.00 clementine
30065 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.00 clementine

Na marginesie, wątek z -90jest tak naprawdę wątkiem w czasie rzeczywistym.

ale

Jest też inna opcja, która jest prawdziwym CLI ps -e -T | grep <application name or pid>

  • -e pokazuje wszystkie procesy
  • -T wyświetla wszystkie wątki
  • | przesyła dane wyjściowe do następnego polecenia
  • grep to filtruje zawartość

Oto przykład:

$ ps -e -T | grep clementine
  PID  SPID TTY          TIME CMD       # this is here for clarity
30046 30046 pts/2    00:00:17 clementine
30046 30049 pts/2    00:00:00 clementine
30046 30050 pts/2    00:00:00 clementine
30046 30051 pts/2    00:00:00 clementine
30046 30052 pts/2    00:00:00 clementine
30046 30053 pts/2    00:00:00 clementine
30046 30054 pts/2    00:00:00 clementine
30046 30055 pts/2    00:00:00 clementine
30046 30056 pts/2    00:00:00 clementine
30046 30057 pts/2    00:00:00 clementine
30046 30058 pts/2    00:00:00 clementine
30046 30060 pts/2    00:00:00 clementine
30046 30061 pts/2    00:00:00 clementine
30046 30062 pts/2    00:00:00 clementine
30046 30064 pts/2    00:00:00 clementine
30046 30065 pts/2    00:00:00 clementine
30046 30066 pts/2    00:00:03 clementine

Każdy z nich ma ten sam PID, więc wiesz, że są w tym samym procesie.

Daniel Hill
źródło
3
dzięki! Co oznacza skrót SPID?
Lazer
7
Zauważ, że istnieje również ps -Tp <pid>, ponieważ grep jest nieco rozmyte, chyba że sprawisz, że będzie bardziej skomplikowany.
Thomas Themel,
4
Jeśli użyjesz sedzamiast tego grep, możesz zachować tytuł za pomocą trywialnego kodu:ps -e -T | sed -n '1p; /clementine/p;'
Mei
dzięki @Daniel ,, Jestem ciekawy, czy. Czy mogę użyć tych PID, aby utworzyć grupę, tak jak robimy to w trybie multicast?
Lazarus
1
SPID jest myląco identyfikatorem wątku.
CMCDragonkai
36

htop , wersja curses programu top, ma opcję wyświetlania do wyświetlania wszystkich wątków dla każdego procesu w widoku drzewa. Uruchomienie htopi naciśnięcie F5spowoduje:

Zrzut ekranu z htopa

Michał Mrożek
źródło
21

Możesz spróbować użyć:

/usr/bin/pstree $PID

Na przykład:

# pstree -p `pidof iceweasel`
iceweasel(3630)─┬─{iceweasel}(3662)
                ├─{iceweasel}(3663)
                ├─{iceweasel}(3664)
                ├─{iceweasel}(3665)
                ├─{iceweasel}(3666)
                ├─{iceweasel}(3674)
                ├─{iceweasel}(3675)
                ├─{iceweasel}(3676)
                ├─{iceweasel}(3677)
                ├─{iceweasel}(3681)
                ├─{iceweasel}(3682)
                ...

Każdy wątek ma swój własny PID.

użytkownik2496
źródło
każdy proces ma swój własny identyfikator procesu (pid). pstree nie pokaże ci wątków w procesach
bjelli
13

Dwa standardowe narzędzia do wyświetlania informacji o procesie to psi top( htopktóre są podobne / ulepszone ).

Uwagi:

  • Wiele programów zmienia widoczną nazwę wątków na coś znaczącego, poniższe narzędzia mogą wyświetlać nazwę binarną lub tę widoczną nazwę (sprawdź PID 1086 w poniższych przykładach).
  • W poniższych przykładach usunąłem większość procesów, aby odpowiedź była krótka.
  • Poniższe przykłady argumentów poleceń są typowe. sprawdź stronę podręcznika dla alternatywnych opcji ( ps -m, ps m, ps H...)

Widok wszystkich lub procesu w czasie rzeczywistym, przy użyciu top -H

top - 16:24:42 up  3:49,  3 users,  load average: 0.23, 0.29, 0.31
Threads: 503 total,   2 running, 501 sleeping,   0 stopped,   0 zombie
%Cpu(s):  9.7 us,  1.6 sy,  0.0 ni, 88.5 id,  0.2 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:   3938668 total,  2148708 used,  1789960 free,   133524 buffers
KiB Swap:  3903484 total,        0 used,  3903484 free.   822904 cached Mem

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
 1054 root      20   0  258664   3524   2692 S  0.0  0.1   0:00.00 rsyslogd
 1086 root      20   0  258664   3524   2692 S  0.0  0.1   0:00.03 in:imuxsock
 1087 root      20   0  258664   3524   2692 S  0.0  0.1   0:00.00 in:imklog
 1090 root      20   0  258664   3524   2692 S  0.0  0.1   0:00.05 rs:main Q:Reg
 2452 fpiat     20   0   25292   7520   3580 S  0.0  0.2   0:00.69 bash         
 2495 fpiat     20   0   25088   6988   3256 S  0.0  0.2   0:00.05 bash

Natychmiastowy widok wszystkich procesów i wątków, za pomocą ps -eLf

$ ps -eLf
UID        PID  PPID   LWP  C NLWP STIME TTY          TIME CMD
root      1054     1  1054  0    4 12:34 ?        00:00:00 /usr/sbin/rsyslogd -n
root      1054     1  1086  0    4 12:34 ?        00:00:00 /usr/sbin/rsyslogd -n
root      1054     1  1087  0    4 12:34 ?        00:00:00 /usr/sbin/rsyslogd -n
root      1054     1  1090  0    4 12:34 ?        00:00:00 /usr/sbin/rsyslogd -n
franklin  2452  2448  2452  0    1 12:35 pts/0    00:00:00 /bin/bash
franklin  2495  2448  2495  0    1 12:36 pts/1    00:00:00 /bin/bash

Wątki informacji o procesie przy użyciu ps -T

ps -T -C rsyslogd
  PID  SPID TTY          TIME CMD
 1054  1054 ?        00:00:00 rsyslogd
 1054  1086 ?        00:00:00 in:imuxsock
 1054  1087 ?        00:00:00 in:imklog
 1054  1090 ?        00:00:00 rs:main Q:Reg

(uwaga: użyj dowolnej opcji -C commandlub, -p PIDaby wybrać proces)

Szczegółowe informacje o wątkach procesu przy użyciu niestandardowego ps

$ ps -L -o pid,lwp,pri,nice,start,stat,bsdtime,cmd,comm  -C rsyslogd
  PID   LWP PRI  NI  STARTED STAT   TIME CMD                         COMMAND
 1054  1054  19   0 12:34:53 Ssl    0:00 /usr/sbin/rsyslogd -n       rsyslogd
 1054  1086  19   0 12:34:53 Ssl    0:00 /usr/sbin/rsyslogd -n       in:imuxsock
 1054  1087  19   0 12:34:53 Ssl    0:00 /usr/sbin/rsyslogd -n       in:imklog
 1054  1090  19   0 12:34:53 Ssl    0:00 /usr/sbin/rsyslogd -n       rs:main Q:Reg
Franklin Piat
źródło
Co oznacza SPID?
firo
8

Można spróbować top -H -p <pid>.
Należy jednak pamiętać, że w niektórych wersjach uniksowych opcja -H nie jest dostępna w toppoleceniu.

Hemant
źródło
2
Zaryzykowałbym, że żaden system UNIX nie obsługuje -H; Linux używa narzędzi GNU (w tym ps), a UNIX nie. (Jest to oczywiście uogólnienie ...)
Mei
1
„top -H -p <pid>” był w stanie zrobić to, co chciałem. Dzięki!
Wing Tang Wong,
4
ps -H le <pid>

Powinno to wyświetlać wątki jako procesy. Pamiętaj również, że wszystkie wątki wielowątkowe muszą mieć ten sam PID. Linux robi to, tworząc grupy wątków. Pierwszy wątek jest liderem grupy, a jego PID to tgid (identyfikator grupy wątków) grupy wątków.

Rzeczywisty PID i status wątków można znaleźć, korzystając z systemu plików / proc. Innym sposobem na osiągnięcie tego jest sprawdzenie PID za pomocą ps, a następnie uruchomienie następującego polecenia:

cat /proc/pid/status

Następnie sprawdź kolejne pids / tgid wątków i uruchom następujące polecenie:

cat /proc/pid/task/threadid/status
Ayush Goyal
źródło
1
top -H -p <process_id>

Spowoduje to wyświetlenie wątków powiązanych z twoim procesem (tj. Process_id) [Używany w Ubuntu. Istnieje możliwość, że opcja -H nie jest dostępna w niektórych wersjach linuksowych]

parasrish
źródło
0
ps huH  -p  pid | wc  -l 

Powyższe polecenie pokazuje liczbę działających wątków dla konkretnego pid procesu, jeśli dla procesu Java

ialiras
źródło
0

Szukałem tego samego i udało mi się wymyślić następujący skrypt bash:
To jest nadal w toku, zaktualizuję to, gdy poprawię skrypt.
Nie jestem ekspertem od unixa, jestem pewien, że jakiś ekspert może napisać go w 2 liniach, z lepszą jakością, ale moim celem jest zapewnienie działającego rozwiązania dla innych.

zaktualizuj o filtr i informacje o procesie

#!/bin/bash

ps -ef --no-headers | while read line; do                 # for each process read the info (without headers)
   IFS='        ' read -r -a array <<< "$line"             # split info into array
   psResultStr="ps -p ${array[1]} -lfT |  wc -c"           # count how many threads per PID
   numThreads=$(eval $psResultStr)                         # trying to convert it to number so i can filter later
   if [ "$numThreads" -gt "1000" ]                          #only show process with 1K or more
   then
        printf "Number of threads for PID:${array[1]} Has $numThreads Threads.  Process info: "
              for ((i = 7; i < ${#array[@]}; ++i)); do       #Process info starts at idx 7
                                position=$(( $i + 1 ))  # bash arrays are 0-indexed
                                lineText=$(echo ${array[$i]}|tr -d '\n')   # remove any new lines
                                printf "%s" "$lineText"                     #output line item
                        done
                        printf "\n\n"
   fi
done
użytkownik648026
źródło