Jika saya tahu nomor PID suatu proses, bagaimana saya bisa mendapatkan namanya?


263

Jika saya memiliki nomor PID untuk suatu proses (pada mesin UNIX), bagaimana saya bisa mengetahui nama proses terkait?

Apa yang harus saya lakukan?


9
Anda dapat menggunakan psatauls -l /proc/$PID/exe
Eddy_Em

1
@ Eddy_Em yang akan memberi Anda file yang dapat dieksekusi, yang tidak selalu nama proses. Juga, itu tidak portabel ...
derobert

9
ps -fp PIDakan menampilkan perintah penuh
Temak

Jawaban:


284

Pada semua sistem yang mendukung POSIX, dan dengan Linux, Anda dapat menggunakan ps:

ps -p 1337 -o comm=

Di sini, proses dipilih oleh PID dengan -p. The -opilihan menentukan format output, commyang berarti nama perintah.

Lihat juga: ps- Spesifikasi Basis Grup Terbuka Masalah 6


28
comm tampaknya memotong perintah hingga 15 karakter. Menggunakan commandbukan perbaikan itu.
Nemo

1
[Ubuntu 14.04.4 LTS] $ ps -p 1 -o comm= init $ ps -p 1 -o command= / sbin / init; yang artinya bukan sekitar 15 karakter, mungkin hanya nama biner vs. path lengkapnya.
OmarOthman

3
Sebenarnya, commberikan nama biner dan commandkembalikan argumen 0
robbie

45

Anda dapat menemukan nama proses atau perintah yang digunakan oleh id-proses atau pid dari

/proc/pid/cmdline

dengan melakukan

cat /proc/pid/cmdline

Di sini pid adalah pid yang ingin Anda cari nama
Untuk exmaple:

 # ps aux

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

Untuk menemukan nama proses yang digunakan oleh pid 2480 Anda dapat menggunakan

# cat /proc/2480/cmdline 

 gnome-terminal

14
Hati-hati: OP menyebutkan UNIX. Tidak semua UNIX mengimplementasikan Plan 9 seperti file khusus proses. Jawaban Anda umumnya hanya berlaku untuk Linux.
slhck

3
Sementara itu benar, mereka menandai pertanyaan "linux". Siapa pun yang menggunakan OS UNIX berbasis non-Linux akan cukup terbiasa dengan harus memodifikasi jawaban sesuai dengan kebutuhan mereka
Andrew White

14

Untuk mendapatkan jalur program menggunakan pid tertentu, Anda dapat menggunakan:

ps ax|egrep "^ [PID]"

atau Anda dapat menggunakan:

ps -a [PID]

masukkan deskripsi gambar di sini


1
ps -adaftar semua proses yang terkait dengan terminal, tidak mengambil input apa pun.
Michael Lee

@ MichaelLee Saya kira itu tergantung pada psversi, procps version 3.2.7bekerja dengan baik.
Pedro Lobito

8
# ls -la /proc/ID_GOES_HERE/exe

Contoh:

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

Yang ini sempurna.
jayarjo

1
Mungkin lebih baik: readlink /proc/1337/exe. readlink - cetak tautan simbolik yang diselesaikan atau nama file kanonik.
Pablo A

8

Anda dapat menggunakan pmap. Saya mencari PID 6649. Dan memotong detail proses ekstra.

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

Perintah ini membantu saya lebih dari yang saya butuhkan, saya memiliki garis penuh proses yang dimulai. Diberikan proses Java, dengan psperintah semua Anda hanya akan melihat java, tetapi sisa parameter yang dilewati akan ditampilkan sepenuhnya dengan pmap.
Daniel Andrei Mincă

3

Anda juga dapat menggunakan awk dalam kombinasi dengan ps

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

contoh:

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

untuk mencetak HEAD LINE yang bisa Anda gunakan

 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
Ini tidak stabil karena juga akan memilih proses yang memasukkan nomor di mana saja dalam perintah mereka. Coba ps ax | grep 1dan lihat apakah itu benar-benar mengembalikan initproses, misalnya. (Dalam kasus saya, ia mengembalikan 119 baris — tidak diinginkan.)
slhck

1
@ slhck Memodifikasi jawaban ... terima kasih atas info .. ps -p 1 -o comm = adalah pilihan terbaik untuk pertanyaan ini.
Gangadhar

Kami tidak perlu dua kali menjalankan untuk mempertahankan header, alih-alih gunakan ps aux | awk 'NR==1 || $2==PID'- dan tidak perlu mengatakan {print $0}karena itu adalah default. Tapi seperti yang Anda komentari, -pitu lebih baik.
dave_thompson_085

3

Mirip dengan Jawaban slhck , tetapi mengandalkan operasi file alih-alih permintaan perintah:

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

[Ubuntu 14.04.4 LTS] cat /proc/1/comm=> init, bukan / sbin / init. Jawabannya menyertakan versi yang lebih panjang. Tapi +1 tetap.
OmarOthman

2

Anehnya, tidak ada yang menyebutkan opsi -f (perintah penuh) untuk ps. Saya suka menggunakannya dengan -e (semuanya) dan menyalurkan hasilnya ke grep sehingga saya dapat mempersempit pencarian saya.

ps -ef | grep <PID>

Ini juga sangat berguna untuk melihat perintah penuh yang dijalankan seseorang yang mengambil banyak sumber daya di sistem Anda. Ini akan menunjukkan kepada Anda opsi dan argumen yang diteruskan ke perintah.


3
Tidak berfungsi pada BSD (mungkin termasuk MacOSX? Saya tidak yakin). Bahkan di mana -e -ftersedia, grepdapat menghasilkan banyak kecocokan salah, misalnya grep 33termasuk pid = 933 atau 339, ppid = 33 atau 933 atau 339, waktu 33 detik atau 33 menit, atau nama program atau argumen yang mengandung 33 - termasuk grepdirinya sendiri. Semua (AFAIK) psmiliki -p, jadi adil ps -fp 33.
dave_thompson_085

0

Saya menemukan metode termudah untuk menjadi dengan perintah berikut:

ps -awxs | grep pid

Selain sangat tidak efisien dibandingkan dengan ps -p${pid}, ini akan mengambil banyak positif palsu - termasuk grepitu sendiri.
Toby Speight

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.