Bir işlemin PID numarasını biliyorsanız, ismini nasıl alabilirim?


263

Bir işlemin PID numarasına sahipsem (bir UNIX makinesinde), ilişkili işlemin adını nasıl öğrenebilirim?

Ne yapmam gerek?


9
Sen kullanabilirsiniz psveyals -l /proc/$PID/exe
Eddy_Em

1
@Eddy_Em, her zaman işlem adı olmayan yürütülebilir dosyayı verir. Ayrıca, bu taşınabilir değil ...
derobert

9
ps -fp PIDtam komutu gösterecek
Temak

Yanıtlar:


284

Tüm POSIX uyumlu sistemlerde ve Linux'ta aşağıdakileri kullanabilirsiniz ps:

ps -p 1337 -o comm=

Burada işlem PID ile birlikte seçilir -p. -oSeçenek, çıktı biçimini belirtir commkomut adını anlamına gelir.

Ayrıca bakınız: ps- Açık Grup Bazında Teknik Özellikler Sayı 6


28
comm komutu 15 karaktere kadar kısaltıyor gibi görünüyor. commandBunun yerine kullanmak onu düzeltir.
Nemo

1
[Ubuntu 14.04.4 LTS] $ ps -p 1 -o comm= init $ ps -p 1 -o command= / sbin / init; bu, yaklaşık 15 karakter değil, belki de sadece ikili dosya adı ile tam yol arasındaki anlamına gelir.
OmarOthman

3
Aslında, commikili dosyanın adını verir ve command0 argümanını döndürür
robbie

45

İşlem adı veya işlem kimliği veya pid tarafından kullanılan komutu

/proc/pid/cmdline

yaparak

cat /proc/pid/cmdline

Burada pid, ismini bulmak istediğiniz
pid'dir. Örneğin:

 # ps aux

   ................
   ................
   user  2480  0.0  1.2 119100 12728 pts/0  Sl   22:42   0:01 gnome-terminal
   ................
   ................

Kullandığınız 2480 numaralı pid tarafından kullanılan işlem adını bulmak için

# cat /proc/2480/cmdline 

 gnome-terminal

14
Dikkatli olun: OP UNIX'ten bahseder. Tüm UNIX'ler, Plan 9 benzeri işleme özgü dosyayı uygulamaz. Cevabınız genellikle sadece Linux için geçerlidir.
slhck

3
Bu doğru olsa da, "linux" sorusunu etiketlediler. Linux tabanlı olmayan bir UNIX işletim sistemi kullanan herkes cevaplarını gereksinimlerine uyacak şekilde değiştirmek zorunda kalacak
Andrew White

14

Programın yolunu belli bir pid kullanarak almak için kullanabilirsiniz:

ps ax|egrep "^ [PID]"

alternatif olarak kullanabilirsiniz:

ps -a [PID]

görüntü tanımını buraya girin


1
ps -aTerminal ile ilişkili tüm işlemleri listeler, giriş yapmaz.
Michael Lee,

@MichaelLee Sanırım iyi, psversiyona bağlı procps version 3.2.7.
Pedro Lobito

8
# ls -la /proc/ID_GOES_HERE/exe

Örnek:

# ls -la /proc/1374/exe
lrwxrwxrwx 1 chmm chmm 0 Mai  5 20:46 /proc/1374/exe -> /usr/bin/telegram-desktop

Bu mükemmel.
jayarjo

1
Muhtemelen daha iyi: readlink /proc/1337/exe. readlink - yazdırılan sembolik linkleri veya kanonik dosya isimlerini yazdırabilir.
Pablo,

8

Pmap kullanabilirsiniz. PID 6649'u arıyorum. Ekstra işlem ayrıntılarını keserek.

$ pmap 6649 | head -1
6649:   /usr/lib64/firefox/firefox

Bu komut bana ihtiyacım olandan daha çok yardımcı oldu, başlayan sürecin tam satırına sahibim. Bir Java süreci göz önüne alındığında, psgöreceğiniz tüm komut ile sadece java, ama geçen parametrelerin tamamı ile birlikte gösterilecektir pmap.
Daniel Andrei Mincă

3

Ayrıca awk'yi ps ile birlikte kullanabilirsiniz.

ps aux | awk '$2 == PID number for a process  { print $0 }'

örnek:

root@cprogrammer:~# ps aux | awk '$2 == 1 { print $0 }'
root         1  0.0  0.2  24476  2436 ?        Ss   15:38   0:01 /sbin/init    

HEAD LINE yazdırmak için kullanabilirsiniz

 ps --headers aux |head -n 1 && ps aux | awk '$2 == 1 { print $0 }'

                 (or) 

 ps --headers aux |head -n 1; ps aux | awk '$2 == 1 { print $0 }'


root@cprogrammer:~# ps --headers aux |head -n 1 && ps aux | awk '$2 == 1 { print $0 }'
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.2  24476  2436 ?        Ss   15:38   0:01 /sbin/init

2
Bu kararsızdır, çünkü komutlarında herhangi bir yerde sayı bulunan işlemleri seçerdi. Örneğin ps ax | grep 1, initişlemi gerçekten döndürüp döndürmediğini kontrol etmeye çalışın . (Benim durumumda 119 satır döndürüyor
istenmiyor

1
@slhck Cevap değiştirildi ... bilgi için teşekkürler .. ps -p 1 -o comm = bu soru için en iyi seçenek.
Gangadhar

Başlıkları korumak için iki kola ihtiyacımız yok, bunun yerine kullanın ps aux | awk 'NR==1 || $2==PID'- ve söylemeliyiz {print $0}çünkü bu varsayılandır. Ama yorumda bulunduğun gibi -p, yine de daha iyi.
dave_thompson_085

3

Slhck'ın Yanıtına Simmilar , ancak komut çağrıları yerine dosya işlemlerine güveniyor:

MYPID=1
cat "/proc/$MYPID/comm"

[Ubuntu 14.04.4 LTS] cat /proc/1/comm=> init, / sbin / init değil. Onun cevabı dahil daha uzun sürüme sahiptir. Ama yine de +1.
OmarOthman

2

Şaşırtıcı bir şekilde, hiç kimse ps için -f (tam komut) seçeneğinden bahsetmedi. -E (her şey) ile kullanmayı seviyorum ve sonuçları grep için kullandım, böylece aramamı daraltabilirim.

ps -ef | grep <PID>

Bu, sisteminizde çok fazla kaynak alan birinin çalıştırdığı komutların tümüne bakmak için de çok faydalıdır. Bu, komuta iletilen seçenekleri ve argümanları gösterir.


3
BSD üzerinde çalışmıyor (belki MacOSX dahil mi? Emin değilim). Uygun olan yerlerde bile -e -f, grepbirçok yanlış eşleşme üretebilir grep 33; örneğin , pid = 933 veya 339, ppid = 33 veya 933 veya 339, 33 saniyelik veya 33 dakikalık zamana sahip olanlar veya 33'ü içeren programın adı veya argüman grep. Tümü (AFAIK) psvar -pbu yüzden sadece, ps -fp 33.
dave_thompson_085 6:16

0

Aşağıdaki komutla olması en kolay yöntemi buluyorum:

ps -awxs | grep pid

Buna kıyasla oldukça verimsiz olmasının yanı sıra ps -p${pid}, bu durum grepkendisi de dahil olmak üzere birçok yanlış pozitif tespit edecektir .
Toby Speight

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.