it-swarm-eu.dev

Existuje způsob, jak zobrazit podrobnosti o všech vláknech, které proces má v Linuxu?

U Windows si myslím, že Process Explorer zobrazuje všechna vlákna v procesu.

Existuje podobný nástroj příkazového řádku pro Linux, který mi může ukázat podrobnosti o všech vláknech, které se konkrétní proces vyskytuje?


Myslím, že jsem se měl ujasnit. Nechci vidět hierarchii procesu, ale seznam všech vláken vytvořených určitým procesem

Podívejte se na tento snímek obrazovky

alt text

Jak toho lze dosáhnout v Linuxu? Díky!

110
Lazer

Klasický nástroj top zobrazuje procesy ve výchozím nastavení, ale lze mu říci, aby ukazoval vlákna klávesou H stisknutím nebo -H možnost příkazového řádku. Existuje také htop , které je podobné top, ale má rolování a barvy; ve výchozím nastavení jsou zobrazeny všechny vlákna (ale to lze vypnout). ps má také několik možností, jak zobrazit vlákna, zejména H a -L.

Existují také nástroje GUI, které mohou zobrazovat informace o vláknech, například qps (jednoduchý obal GUI kolem ps) nebo conky (monitor systému se spoustou) možností konfigurace).

Pro každý proces je v /proc/12345 kde 12345 je ID procesu. Informace o každém vlákně jsou k dispozici v /proc/12345/task/67890 kde 67890 je ID vlákna jádra. Zde získávají informace ps, top a další nástroje.

Výpis podprocesů pod Linuxem

Aktuální poskytnout odpovědi

Chtěl bych objasnit, že každá odpověď zde poskytuje přesně to, co jste zadali, seznam všech vláken spojených s procesem, nemusí to být zřejmé v htop, protože ve výchozím nastavení jsou seznamy všechna vlákna v systému, nejen proces, ale top -H -p <pid> funguje lépe například:

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

Jako vedlejší poznámka, vlákno s -90 je ve skutečnosti vlákno v reálném čase.

ale

Existuje také další možnost, která je pravdivá CLI ps -e -T | grep <application name or pid>

  • -e zobrazuje všechny procesy
  • -T uvádí všechna vlákna
  • | přivede výstup na další příkaz
  • grep filtruje obsah

Zde je příklad:

$ 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ždý z nich má stejný PID, takže víte, že jsou ve stejném procesu.

67
Daniel Hill

htop , top curses verze, má možnost zobrazení pro zobrazení všech vláken pro každý proces ve stromovém zobrazení. Počínaje htop a stisknutím F5 bude mít za následek:

Screenshot of htop

38
Michael Mrozek

Můžete zkusit použít:

/usr/bin/pstree $PID

Například:

# 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ždé vlákno má svůj vlastní PID.

22
user2496

Dva standardní nástroje pro zobrazení informací o procesu jsou ps a top (a htop což je podobné/ vylepšeno).

Poznámky:

  • Mnoho programů mění zjevný název podprocesů na něco smysluplného, ​​níže uvedené nástroje mohou buď zobrazit binární jméno, nebo toto zjevné jméno (viz příklady PID 1086 v níže uvedených příkladech).
  • V níže uvedených příkladech jsem odstranil většinu postupu, aby byla odpověď krátká.
  • Níže uvedené argumenty příkazů jsou běžné. zkontrolujte alternativní možnosti na stránce manuálu (ps -m, ps m, ps H...)

Zobrazení všech nebo zpracování v reálném čase pomocí 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

Okamžité zobrazení všech procesů a vláken 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

Zobrazuje informace o procesu pomocí 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

(poznámka: použijte některou z možností -C command nebo -p PID vyberte proces)

Podrobnosti vlákno informace o procesu, pomocí vlastní 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
15
Franklin Piat

Si můžete vyzkoušet top -H -p <pid>.
Všimněte si však, že volba -H 'některých unixových příchutí není k dispozici v příkazu top.

8
Hemant
ps -H le <pid>

To zobrazí vlákna jako procesy. Nezapomeňte také, že všechna vlákna vícevláknových musí mít stejný PID. Linux to dělá vytvořením skupin vláken. První vlákno je vedoucí skupiny a jeho PID bude tgid (vlákno groupID) skupiny vláken.

Aktuální PID a stav vláken můžete zjistit pomocí systému souborů/proc. Dalším způsobem, jak toho dosáhnout, je zkontrolovat PID pomocí ps a poté spustit následující příkaz:

cat /proc/pid/status

Pak zkontrolujte další pids/tgid vláken a spusťte následující příkaz:

cat /proc/pid/task/threadid/status
4
Ayush Goyal
top -H -p <process_id>

Zobrazí se vám seznam vláken souvisejících s vaším procesem (tj. Process_id) [Používá se na Ubuntu. Existuje možnost, že volba -H není k dispozici u některých linuxových příchutí]

1
parasrish
ps huH  -p  pid | wc  -l 

Výše uvedený příkaz ukazuje počet běžících vláken pro konkrétní proces pid pokud pro Java proces

0
ialiras

Hledal jsem to samé a dokázal jsem přijít s následujícím bash skriptem,
Toto stále probíhá, aktualizuji to, jak vylepšuji skript.
Nejsem unixový odborník, jsem si jistý, že nějaký odborník to může napsat ve 2 řádcích, v lepší kvalitě, ale mým záměrem je poskytnout pracovní řešení pro ostatní.

aktualizace s informacemi o filtru a procesu

#!/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
0
JavaSheriff