Bagaimana saya bisa tahu jalur absolut dari proses yang sedang berjalan?

93

Jika saya memiliki banyak salinan dari aplikasi yang sama pada disk, dan hanya satu yang berjalan, seperti yang saya lihat ps, bagaimana saya bisa mengetahui jalur absolut untuk membedakannya dari yang lain?

Jader Dias
sumber

Jawaban:

110
% sudo ls -l /proc/PID/exe

misalnya:

% ps -auxwe | grep 24466
root 24466 0.0 0.0 1476 280? S 2009 0:00 mengawasi sshd
% sudo ls -l / proc / 24466 / exe
lrwxrwxrwx 1 root root 0 Feb 1 18:05 / proc / 24466 / exe -> /package/admin/daemontools-0.76/command/supervise
akira
sumber
1
Di sistem saya (ubuntu 14.04) Anda tidak perlu menjadi superuser untuk menjalankan lsperintah.
jarno
3
@jarno ls: cannot read symbolic link /proc/28783/exe: Permission denied- ini bukan tentang menjalankan lsperintah, ini tentang mengakses info proses dari proses yang bukan milik Anda. Di kotak saya, sekitar 97% dari semua proses yang terdaftar di / proc adalah proses root, dan yang lainnya didistribusikan lebih dari 11 pengguna yang berbeda.
Irfy
20

Menggunakan:

pwdx $pid

Ini memberi Anda direktori kerja pid saat ini, bukan jalur absolutnya.

Biasanya whichperintah akan memberi tahu Anda yang sedang dipanggil dari shell:

#> which vlc
/usr/bin/vlc
seenu
sumber
3
jawaban ini perlu lebih banyak upvote ..
Kokizzu
8
@Kokizzu Tidak, tidak karena itu tidak menjawab pertanyaan sama sekali. Perintah mana yang hanya memberi tahu Anda biner mana yang akan dijalankan jika Anda menjalankan perintah sekarang. Pertanyaannya adalah "biner mana yang sudah berjalan di sana". Bayangkan misalnya memiliki selusin jdks di komputer Anda. Jika Anda ingin tahu untuk menjalankan proses java dari mana jdk itu diambil, yang tidak membantu Anda dengan itu. Ini hanya akan memberi tahu Anda dari mana jdk itu akan diambil, jika Anda menjalankannya sekarang. Jawaban yang diterima juga yang benar.
noamik
Cara yang jelas jawaban ini salah: pada mesin saya, saya menjalankan proses dengan versi JDK yang berbeda dan beberapa 32bits / 64bits. Jika saya ingin mengidentifikasi versi jstack / jmap yang benar untuk proses, jawaban di atas tidak akan berfungsi sementara jawaban yang diterima akan.
Daniel Da Cunha
@Kokizzu Ini hanya menjawab pertanyaan, "Apa direktori kerja saat ini dari proses $pid?" Posting yang diedit masih belum menjawab pertanyaan. whichhanya mengatakan "Jika perintah ada di jalan, lalu apa itu?"
John Strood
pwdxkembalikan saya jalur absolut dari program exectuable dari proses tergantung pada pid pada redhat x64 6.3.
Nick Dong
14

Salah satu caranya adalah ps -ef

fpmurphy
sumber
5
tidak bekerja untuk layanan tertentu, itu hanya menyediakan jalur relatif
Jader Dias
Membantu saya mengidentifikasi proses melalui perintah yang dimulai.
jpierson
2

Jawaban cepatnya adalah menggunakan psopsi atau /procinfo sistem file. Itu biasanya akan berhasil, tetapi tidak dijamin. Secara umum, tidak ada jawaban pasti dan pasti. Misalnya, bagaimana jika file yang dieksekusi dihapus selama eksekusi, sehingga tidak ada jalur ke file?

Lihat FAQ Unix untuk sedikit lebih detail, terutama pertanyaan 4.3 dan 4.4.

mpez0
sumber
2

Mengapa semua orang mengharapkan Anda mengetahui PID? Inilah cara yang ramah manusia:

pwdx `pgrep ###process_name###`
moodboom
sumber
Pertanyaannya menyatakan "seperti yang saya lihat ps", sehingga mungkin akan menampilkan PID
Scz
Ah ok benar. Saya masih menemukan ini menjadi lebih cepat dalam banyak kasus penggunaan saya.
moodboom
1

lsof adalah pilihan. Anda dapat mencoba sesuatu seperti di bawah ini:

lsof -p PROCESS_ID

Ini akan mendaftar semua file yang dibuka oleh proses termasuk lokasi aktual yang dapat dieksekusi. Maka dimungkinkan untuk menambahkan beberapa awk, cut, grep dll. Untuk mengetahui informasi yang Anda cari.

Sebagai contoh, saya menjalankan perintah berikut untuk mengidentifikasi dari mana proses 'java' saya berasal:

lsof -p 12345 | awk '{print $ NF}' | grep 'java $'

ram
sumber
Bagaimana ini berbeda dari jawaban yang sudah diposting sebenarnya?
Pimp Juice,
0

Anda bisa menggunakannya

readlink /proc/$(pgrep -x -U $(id -ur) APP_NAME)/exe

atau

find /proc/$(pgrep -x -U $(id -ur) APP_NAME)/exe -printf "%l\n"

untuk mendapatkan jalur absolut. PID adalah prosesnya.

jarno
sumber