Apakah ada cara untuk melihat detail semua utas yang dimiliki suatu proses di Linux?

101

Untuk Windows, saya pikir Process Explorer menunjukkan kepada Anda semua utas dalam suatu proses.

Apakah ada utilitas baris perintah yang serupa untuk Linux yang dapat menunjukkan kepada saya detail tentang semua utas proses tertentu yang muncul?


Saya pikir saya harus membuat diri saya lebih jelas. Saya tidak ingin melihat hierarki proses, tetapi daftar semua utas yang dihasilkan oleh proses tertentu

Lihat tangkapan layar ini

teks alternatif

Bagaimana ini bisa dicapai di Linux? Terima kasih!

Lazer
sumber
stackoverflow.com/questions/268680/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Jawaban:

101

Alat klasik topmenunjukkan proses secara default tetapi dapat dikatakan untuk menunjukkan utas dengan Htombol tekan atau -Hopsi baris perintah. Ada juga htop , yang mirip toptetapi memiliki scrolling dan warna; ini menunjukkan semua utas secara default (tapi ini bisa dimatikan). psjuga memiliki beberapa opsi untuk menampilkan utas, terutama Hdan -L.

Ada juga alat GUI yang dapat menampilkan informasi tentang utas, misalnya qps (pembungkus GUI sederhana ps) atau conky (monitor sistem dengan banyak opsi konfigurasi).

Untuk setiap proses, banyak informasi tersedia di /proc/12345mana 12345ID proses. Informasi tentang setiap utas tersedia di /proc/12345/task/67890mana 67890ID utas kernel. Di sinilah ps, topdan alat-alat lain mendapatkan informasinya.

Gilles
sumber
Saya htoptampaknya tidak menunjukkan kepada saya utas. Mereka menyebutkan Hkunci sebagai cara untuk bertukar antara memperlihatkan dan menyembunyikan utas, tetapi masih berfungsi sebagai kunci Bantuan ...
Alexis Wilke
1
@AlexisWilke Huruf kecil huntuk bantuan, huruf besar Huntuk menampilkan / menyembunyikan utas.
Gilles
58

Daftar utas di Linux

Saat ini memberikan jawaban

Saya ingin memperjelas bahwa setiap jawaban di sini memberi Anda apa yang telah Anda tentukan, daftar semua utas yang terkait dengan suatu proses, ini mungkin tidak jelas htopkarena, secara default, mencantumkan semua utas pada sistem, bukan hanya proses tetapi top -H -p <pid>bekerja lebih baik misalnya:

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

Sebagai catatan, utas dengan -90sebenarnya adalah utas real-time.

tapi

Ada juga pilihan lain yang benar CLI ps -e -T | grep <application name or pid>

  • -e menunjukkan semua proses
  • -T daftar semua utas
  • | menyalurkan output ke perintah selanjutnya
  • grep ini memfilter konten

Ini sebuah contoh:

$ 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

Masing-masing memiliki PID yang sama sehingga Anda tahu mereka dalam proses yang sama.

Daniel Hill
sumber
3
Terima kasih! Apa kepanjangan dari SPID?
Lazer
7
Perhatikan bahwa ada juga ps -Tp <pid>, karena grep agak kabur kecuali Anda membuatnya lebih rumit.
Thomas Themel
4
Jika Anda menggunakan sedbukannya grepAnda dapat melestarikan judul dengan kode sepele:ps -e -T | sed -n '1p; /clementine/p;'
Mei
1
@Lazer sulit untuk mengatakan apa artinya, tetapi man topmengatakan itu adalah alias untuk LWPdan TID, sedangkan LWP = proses ringan, dan TID = pengenal utas.
Hi-Angel
1
SPID membingungkan ID utas.
CMCDragonkai
36

htop , versi kutukan atas, memiliki opsi tampilan untuk menampilkan semua utas untuk setiap proses dalam tampilan hierarki. Memulai htopdan menekan F5akan menghasilkan:

Cuplikan layar htop

Michael Mrozek
sumber
21

Anda dapat mencoba menggunakan:

/usr/bin/pstree $PID

Sebagai contoh:

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

Setiap utas memiliki PID masing-masing.

pengguna2496
sumber
setiap proses memiliki proses id (pid) sendiri. pstree tidak akan menunjukkan kepada Anda utas di dalam proses
bjelli
13

Dua alat standar untuk menunjukkan informasi proses adalah psdan top(dan htopyang serupa / diperbaiki ).

Catatan:

  • Banyak program mengubah nama jelas utas menjadi sesuatu yang bermakna, alat di bawah ini dapat menampilkan nama biner atau nama semu itu (periksa PID 1086 pada contoh di bawah).
  • Dalam contoh di bawah ini, saya telah menghapus sebagian besar proses untuk membuat jawaban singkat.
  • Contoh argumen perintah di bawah ini adalah yang umum. periksa manual ini untuk pilihan alternatif ( ps -m, ps m, ps H...)

Tampilan realtime dari semua atau proses, menggunakan 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

Tampilan instan semua proses dan utas, gunakan 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

Utas informasi dari suatu proses, menggunakan 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

(catatan: gunakan salah satu opsi -C command, atau -p PIDuntuk memilih proses)

Detail utas informasi suatu proses, menggunakan custom 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
sumber
Apa artinya SPID?
Firo
8

Anda bisa mencoba top -H -p <pid>.
Tetapi harap dicatat pada beberapa pilihan '-H' rasa Unix tidak tersedia dalam topperintah.

Hemant
sumber
2
Saya berani bahwa tidak ada dukungan UNIX -H; Linux menggunakan alat GNU (termasuk ps) dan UNIX tidak. (Hal ini, tentu saja, generalisasi ...)
Mei
1
"top -H -p <pid>" dapat melakukan apa yang saya inginkan. Terima kasih!
Wing Tang Wong
4
ps -H le <pid>

Ini akan menampilkan utas sebagai proses. Juga ingat bahwa semua utas multi-utas harus memiliki PID yang sama. Linux melakukan ini dengan membuat grup utas. Utas pertama adalah pemimpin grup dan PID-nya akan tgid (utas grupID) dari grup utas.

Anda dapat mengetahui PID aktual dan status utas dengan menggunakan sistem file / proc. Cara lain untuk mencapai ini adalah dengan memeriksa PID dengan menggunakan ps, kemudian jalankan perintah berikut:

cat /proc/pid/status

Kemudian periksa lebih lanjut id / tgid dari utas dan jalankan perintah berikut:

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

Ini akan memberi Anda daftar utas, yang terkait dengan proses Anda (yaitu process_id) [Digunakan di Ubuntu. Ada kemungkinan bahwa opsi -H tidak tersedia pada beberapa rasa linux]

parasrish
sumber
0
ps huH  -p  pid | wc  -l 

Perintah di atas menunjukkan jumlah running thread untuk proses tertentu pid jika untuk proses java

ialiras
sumber
0

Saya mencari yang sama, dan dapat membuat skrip bash berikut,
Ini masih bekerja, saya akan memperbarui ini karena saya meningkatkan skrip.
Saya bukan pakar unix, saya yakin beberapa pakar dapat menulisnya dalam 2 baris, dengan kualitas yang lebih baik, tetapi tujuan saya adalah untuk memberikan solusi yang berfungsi untuk orang lain.

perbarui dengan filter dan proses informasi

#!/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
pengguna648026
sumber