it-swarm-id.com

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

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

alt text

Bagaimana ini bisa dicapai di Linux? Terima kasih!

110
Lazer

Alat klasik top menunjukkan proses secara default tetapi dapat dikatakan untuk menampilkan utas dengan H tekan tombol atau -H opsi baris perintah. Ada juga htop , yang mirip dengan top tetapi memiliki gulir dan warna; ini menunjukkan semua utas secara default (tapi ini bisa dimatikan). ps juga memiliki beberapa opsi untuk menampilkan utas, terutama H dan -L.

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

Untuk setiap proses, banyak informasi tersedia di /proc/12345 dimana 12345 adalah ID proses. Informasi tentang setiap utas tersedia di /proc/12345/task/67890 dimana 67890 adalah ID utas kernel. Di sinilah ps, top dan alat lainnya mendapatkan informasi mereka.

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 dalam htop karena, secara default, daftar semua utas pada sistem, bukan hanya prosesnya tetapi top -H -p <pid> berfungsi 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 -90 sebenarnya 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 mencantumkan semua utas
  • | mengirimkan 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.

67
Daniel Hill

htop , versi kutukan atas, memiliki opsi tampilan untuk menampilkan semua utas untuk setiap proses dalam tampilan hierarki. Mulai htop dan menekan F5 akan menghasilkan:

Screenshot of htop

38
Michael Mrozek

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.

22
user2496

Dua alat standar untuk menampilkan informasi proses adalah ps dan top (dan htop yang serupa/ ditingkatkan ).

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 dalam 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 halaman manual untuk opsi 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, menggunakan 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

tas 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 PID untuk memilih proses)

Perincian utas informasi dari 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
15
Franklin Piat

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

8
Hemant
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
4
Ayush Goyal
top -H -p <process_id>

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

1
parasrish
ps huH  -p  pid | wc  -l 

Perintah di atas menunjukkan jumlah running thread untuk proses tertentu pid if for Java proses

0
ialiras

Saya mencari yang sama, dan dapat membuat skrip bash berikut,
Ini masih dalam proses, saya akan memperbarui ini saat 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
0
JavaSheriff