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.

grigoryvp
sumber

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.

Blair Zajac
sumber
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
Xerxes
sumber
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)

HappySpaceInvader
sumber
1

ps -p <pid> -Ocommand

L1A1:~ a1155344$ ps -p1 -Ocommand
  PID   TT  STAT      TIME COMMAND
    1   ??  Ss     0:02.26 /sbin/launchd
Jason Tan
sumber