Cara mendapatkan (dari terminal) jumlah total utas (per proses dan total untuk semua proses)

32

Saya mencoba googling, tetapi saya tidak dapat menemukannya. Saya mencari:

  1. jumlah utas dalam proses X

  2. jumlah total utas yang berjalan saat ini

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

Jawaban:

53

Untuk mendapatkan jumlah utas untuk pid yang diberikan:

ps -o nlwp <pid>

Untuk mendapatkan jumlah semua utas yang berjalan di sistem:

ps -eo nlwp | tail -n +2 | awk '{ num_threads += $1 } END { print num_threads }'
jcollado
sumber
1
ps -o nlwp <pid>mengembalikan NLWP :), apa artinya itu?
Siddharth
2
@Siddharth NLWP adalah singkatan dari Number of LightWeight Processes yang merupakan jumlah utas.
jcollado
Anda dapat menekan "NLWP" dengan "h" (sembunyikan tajuk); yaitu:ps h -o nlwp $pid
bufh
7

Untuk menemukan jumlah utas yang menjalankan satu proses, Anda dapat melihatnya /proc/<pid>/status. Seharusnya daftar jumlah utas sebagai salah satu bidang.

anaken78
sumber
3

Saya mendasarkan jawaban ini di sekitar ps axms. psadalah alat yang bagus untuk mendaftar apa yang sedang berjalan.

Jika Anda ingin memfilternya dengan suatu proses, Anda dapat mencoba sesuatu seperti ini:

echo $(( `ps axms | grep firefox | wc -l`  - 1))

Kami kurangi 1 karena grep akan ditampilkan dalam daftar itu.

Untuk semua utas secara umum, ini seharusnya berfungsi:

echo $(( `ps axms | wc -l`  - 1))

Kami kurangi satu kali ini karena ada baris tajuk.

Oli
sumber
Ini tidak akurat, karena melaporkan utas tambahan per proses
Score_Under
1

Untuk mendapatkan jumlah total utas (bagian-bagian kecil dari proses yang berjalan secara bersamaan) dari Anda dapat menggunakan perintah ps -o nlwp <pid>Ini berfungsi sepanjang waktu. Tetapi jika Anda lebih suka mencoba melihatnya melalui file. Anda mungkin harus melihat file yang dibuat untuk setiap proses sistem. Di sana Anda bisa mendapatkan detail akhir dari proses tersebut. Untuk setiap proses, ada folder yang dibuat di /proc/<pid>sana Anda dapat melihat semua detail lainnya juga.

Laksith
sumber
1

Di linux secara khusus, berikut adalah salah satu cara untuk melakukannya per-proses:

#!/bin/sh
while read name val; do
    if [ "$name" = Threads: ]; then
        printf %s\\n "$val"
        return
    fi
done < /proc/"$1"/status

Anda kemudian dapat memanggil skrip ini dengan PID sebagai argumen, dan skrip ini akan melaporkan jumlah utas yang dimiliki oleh proses itu.

Untuk mendapatkan jumlah utas untuk seluruh sistem, ini sudah cukup:

#!/bin/sh
count() {
    printf %s\\n "$#"
}
count /proc/[0-9]*/task/[0-9]*

Pendekatan ini mungkin tampak sedikit ortodoks karena mereka sangat bergantung pada fitur shell, tetapi sebagai imbalannya keduanya lebih cepat daripada pendekatan yang sesuai psdan awkberbasis pada mesin saya (sementara juga tidak membuat thread tambahan sendiri untuk pipa). Ingatlah bahwa shell yang diluncurkan untuk menjalankan skrip ini akan memiliki utas sendiri (atau lebih, jika Anda menggunakan implementasi yang aneh).

Score_Under
sumber