Bir işlemin Linux'taki tüm iş parçacıklarının ayrıntılarını görmenin bir yolu var mı?


101

Windows için, İşlem Gezgini'nin işlem altındaki tüm konuları gösterdiğini düşünüyorum .

Linux için, belirli bir işlemin ortaya çıkardığı tüm başlıklar hakkında ayrıntıları gösterebilen benzer bir komut satırı yardımcı programı var mı?


Sanırım kendimi daha netleştirmeliydim. İşlem hiyerarşisini görmek istemiyorum, ancak belirli bir işlem tarafından oluşturulan tüm konuların listesi

Bu ekran görüntüsüne bakın

alt metin

Linux'ta bu nasıl başarılabilir? Teşekkürler!


Yanıtlar:


101

Klasik araç topişlemleri varsayılan olarak gösterir, ancak Htuşa basılması veya -Hkomut satırı seçeneğiyle konuları göstermesi söylenebilir . Orada da htop benzer olan topancak kaydırma ve renkler vardır; varsayılan olarak tüm konuları gösterir (ancak bu kapatılabilir). psayrıca konuları göstermek için birkaç seçeneğe de sahiptir, özellikle Hve -L.

Örnek için parçacığı hakkında bilgi gösterebilir GUI araçları da vardır qps (etrafında basit bir GUI sarıcı ps) ya da conky (yapılandırma seçenekleri dolu bir sistem monitörü).

Her işlem için, işlem kimliğinin /proc/12345nerede 12345olduğu konusunda birçok bilgi mevcuttur . Her bir iş parçacığı hakkında bilgi, çekirdek iş parçacığı kimliğinin /proc/12345/task/67890nerede 67890olduğu konusunda mevcuttur . Bu noktada ps, topve diğer araçlar kendi bilgi alabilirsiniz.


Benim htopipliklerim bana görünmüyor. HAnahtarları göstermek ve gizlemek arasında geçiş yapmanın bir yolu olarak bahsediyorlar , ancak yine de Yardım anahtarı olarak çalışıyor ...
Alexis Wilke

1
@AlexisWilke hYardım için Küçük Harf , Hkonuları göstermek / gizlemek için büyük Harf .
Gilles,

58

Linux altındaki konuları listeleme

Güncel cevaplar sağlamak

Buradaki her cevabın size tam olarak belirttiğiniz şeyi, bir süreçle ilgili tüm konu başlıklarının bir listesini sağladığını açıkça belirtmek isterim, bu htopvarsayılan olarak sistemdeki bütün konuları listelediği için açık olmayabilir. sadece süreç değil top -H -p <pid>, örneğin daha iyi çalışır:

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

Bir yan not olarak, iş parçacığı -90aslında gerçek zamanlı bir iş parçacığı.

fakat

Gerçek CLI olan başka bir seçenek daha var ps -e -T | grep <application name or pid>

  • -e tüm süreçleri gösterir
  • -T tüm konuları listeler
  • | çıkışı bir sonraki komuta aktarır
  • grep bu içeriği filtreler

İşte bir örnek:

$ 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

Bunların her biri aynı PID'ye sahip olduğundan, aynı süreçte olduklarını biliyorsunuz.


3
Teşekkürler! SPID ne anlama geliyor?
Lazer

7
Ayrıca grep biraz karışık olduğundan ps -Tp <pid> olduğunu unutmayın.
Thomas Themel

4
Onun sedyerine kullanırsanız grep, başlığı önemsiz kodla koruyabilirsiniz:ps -e -T | sed -n '1p; /clementine/p;'
Mei,

thanx @Daniel ,, Merak ediyorum. Bu PID'leri çoklu yayında yaptığımız gibi bir grup yapmak için kullanabilir miyim?
lazarus

1
SPID kafa karıştırıcı bir şekilde iplik kimliğidir.
CMCDragonkai

36

Bir curses sürümü olan htop , her işlem için tüm iş parçacıklarını ağaç görünümünde göstermek için bir ekran seçeneğine sahiptir. Başlamak htopve basmak aşağıdakilere F5yol açar:

Htop ekran görüntüsü


21

Kullanmayı deneyebilirsiniz:

/usr/bin/pstree $PID

Örneğin:

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

Her iş parçacığının kendi PID'si vardır.


Her bir işlem kendi işlem kimliğine (pid) sahiptir. pstree işlemler içindeki konuları göstermeyecek
bjelli

13

İki standart araçlar işlem bilgiler göstermek için psve top(ve htop/ benzer olan gelişmiş ).

Notlar:

  • Birçok program, dişlilerin görünen adını anlamlı bir şeyle değiştirir, aşağıdaki araçlar ikili adı veya görünen adını görüntüleyebilir (aşağıdaki örneklerde PID 1086'yı kontrol edin).
  • Aşağıdaki örneklerde, cevabı kısa tutmak için çoğu işlemi kaldırdım.
  • Aşağıdaki komut argümanları örneği ortak olanlardır. (alternatif seçenekler için manpage kontrol ps -m, ps m, ps H...)

Tümünün veya işlemin gerçek zamanlı görünümü, 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

Tüm işlemlerin ve iş parçacıklarının anında görünümü 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

Bir işlemin bilgilerini kullanarak 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

(not: seçeneklerden birini kullanın -C commandveya -p PIDişlemi seçmek için)

Özel kullanarak, bir işlemin ayrıntılarını gösterir 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

SPID ne demektir?
firo

8

Deneyebilirsin top -H -p <pid>.
Ancak bazı Unix tatları '-H' seçeneğinin topkomutta mevcut olmadığını lütfen unutmayın .


2
Hiç UNIX desteklediğini girişim olacaktır -H; Linux (dahil ps) GNU araçlarını kullanır ve UNIX kullanmaz. (Bu, elbette bir genellemedir ...)
Mei,

1
"top -H -p <pid>" istediğimi yapmayı başardı. Teşekkürler!
Wing Tang Wong

4
ps -H le <pid>

Bu, işlemleri süreç olarak konuları gösterecektir. Ayrıca çok dişli bir parçacığın tüm iş parçacıklarının aynı PID'ye sahip olması gerektiğini unutmayın. Linux bunu iplik grupları yaparak yapar. İlk iş parçacığı grubun lideridir ve PID'si iş parçacığı grubunun tgid (iş parçacığı grubu kimliği) olacaktır.

/ Proc dosya sistemini kullanarak gerçek PID ve dişlerin durumunu öğrenebilirsiniz. Bunu başarmanın başka bir yolu ps kullanarak PID'yi kontrol etmek ve ardından aşağıdaki komutu çalıştırmaktır:

cat /proc/pid/status

Ardından, diğer pids / tgid ipliğini kontrol edin ve aşağıdaki komutu çalıştırın:

cat /proc/pid/task/threadid/status

1
top -H -p <process_id>

Bu, işleminizle ilgili olan konuları listeler (örn. Process_id) [Ubuntu'da kullanılır. -H seçeneğinin bazı linux tatlarında kullanılamaması olasılığı vardır]


0
ps huH  -p  pid | wc  -l 

Yukarıdaki komut, eğer java işlemi için belirli işlem pidinde çalışan iş parçacığının sayısını


0

Aynı şeyi arıyordum ve şu bash betiğini bulabildim,
Bu hala devam eden bir çalışma, betiği geliştirdiğimde bunu güncelleyeceğim.
Unix uzmanı değilim, bazı uzmanların daha iyi kalitede 2 satırda yazabildiğinden eminim, ancak niyetim başkalarına çalışma çözümü sunmak.

filtre ve işlem bilgisi ile güncelleme

#!/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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.