bagaimana cara mendapatkan nama file proses dari PID di MacOS?


13

Apakah mungkin untuk mendapatkan nama file dari suatu proses menggunakan PID? ps menampilkan banyak informasi berguna tentang suatu proses, tetapi tidak memberi petunjuk tentang lokasi file yang dapat dieksekusi proses.

Jawaban:


13

Salah satu cara untuk mendapatkan lokasi biner proses adalah dengan menggunakan lsofdan grepuntuk txtsegmen pertama . Misalnya, dalam shell untuk melihat biner apa shell itu, gunakan PID shell di tempat $$.

$ lsof -p $$ | grep txt
bash    78228 blair  txt    REG   14,2   1244928   6568359 /bin/bash
bash    78228 blair  txt    REG   14,2   1059792  23699809 /usr/lib/dyld
bash    78228 blair  txt    REG   14,2 136368128  81751398 /private/var/db/dyld/dyld_shared_cache_i386

Anda dapat melihat bahwa shell sedang digunakan /bin/bash.

Teknik ini berfungsi jika proses diluncurkan menggunakan jalur absolut atau relatif. Misalnya, masuk ke satu shell dan berjalan

$ sleep 1234567

dan menggunakan psdi shell lain hanya menunjukkan bagaimana diluncurkan:

$ ps auxww|grep '[s]leep'
blair    79462   0.0  0.0   600908    744 s011  S+   11:17PM   0:00.00 sleep 1234567

menggunakan lsofpertunjukkan biner yang dijalankannya:

$ lsof -p 79462 | awk '$4 == "txt" { print $9 }'
/opt/local-development/bin/gsleep

Saya memiliki MacPorts coreutils + with_default_names diinstal, yang menjelaskan bahwa saya mengambil gsleepdan tidak /bin/sleep.


Memipis output lsof melalui awk berfungsi dengan baik, dengan satu tambahan kecil. Saya menambahkan ; exitsetelah pernyataan cetak sehingga hanya txtentri pertama yang akan dicetak walaupun ada beberapa seperti pada contoh bash.
qqx

2

Contoh: Anda mencari nama perintah proses asosiasi untuk PID 45109...

>    % ps awx | awk '$1 == 45109 { print $5 }'
>    /Applications/Safari.app/Contents/MacOS/Safari

2
Tidak akan menampilkan path biner penuh jika biner dimulai hanya dengan nama tanpa menentukan path.
grigoryvp

tidak berfungsi dengan benar, jika path berisi spasi putih
Peter Lapisu


1

ps -ef dengan grep bekerja untuk saya. Untuk nama file tertentu, cukup pipa melalui grep dengan demikian:

MacBook:~ Me$ ps -ef | grep Safari | grep -v grep
  501 15733   301   0   0:25.76 ??         1:58.24 /Applications/Safari.app/Contents/MacOS/Safari -psn_0_4977855

('Grep -v grep' akhir itu hanya menghentikan Anda mendapatkan perintah grep Anda sendiri di output)


1

ps -p <pid> -Ocommand

L1A1:~ a1155344$ ps -p1 -Ocommand
  PID   TT  STAT      TIME COMMAND
    1   ??  Ss     0:02.26 /sbin/launchd
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.