Làm thế nào tôi có thể biết đường dẫn tuyệt đối của một quy trình đang chạy?


93

Nếu tôi có nhiều bản sao của cùng một ứng dụng trên đĩa và chỉ có một bản đang chạy, như tôi có thể thấy ps, làm thế nào tôi có thể biết đường dẫn tuyệt đối để phân biệt với các ứng dụng khác?

Câu trả lời:


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

ví dụ:

% ps -auxwe | grep 24466
gốc 24466 0,0 0,0 1476 280? S 2009 0:00 giám sát 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

1
Trong hệ thống của tôi (ubfox 14.04), bạn không cần phải là siêu người dùng để chạy lslệnh.
jarno

3
@jarno ls: cannot read symbolic link /proc/28783/exe: Permission denied- không phải là chạy lslệnh, mà là truy cập thông tin quy trình của một quy trình không thuộc về bạn. Trên hộp của tôi, khoảng 97% tất cả các quy trình được liệt kê trong / Proc là các quy trình gốc và các quy trình khác được phân phối trên 11 người dùng khác nhau.
Irfy

20

Sử dụng:

pwdx $pid

Điều này cung cấp cho bạn thư mục làm việc hiện tại của pid, không phải đường dẫn tuyệt đối của nó.

Thông thường whichlệnh sẽ cho bạn biết cái nào đang được gọi từ shell:

#> which vlc
/usr/bin/vlc

3
câu trả lời này cần nhiều hơn nữa ..
Kokizzu

8
@Kokizzu Không, không phải vì nó hoàn toàn không trả lời câu hỏi. Lệnh nào chỉ cho bạn biết nhị phân nào sẽ được chạy nếu bạn thực thi lệnh ngay bây giờ. Câu hỏi là "nhị phân nào đã chạy ở đó". Hãy tưởng tượng ví dụ có một tá jdks trên máy tính của bạn. Nếu bạn muốn biết về một quy trình java đang chạy mà jdk đã được lấy từ đó, điều đó không giúp bạn làm điều đó. Nó sẽ chỉ cho bạn biết jdk sẽ được lấy từ đâu, nếu bạn thực thi nó ngay bây giờ. Câu trả lời được chấp nhận cũng là câu trả lời đúng.
noamik

Một cách rõ ràng câu trả lời này là sai: trên máy của tôi, tôi chạy các quy trình với các phiên bản JDK khác nhau và một số 32 bit / 64 bit. Nếu tôi muốn xác định phiên bản jstack / jmap chính xác cho quy trình, câu trả lời ở trên sẽ không hoạt động trong khi câu trả lời được chấp nhận sẽ.
Daniel Da Cunha

@Kokizzu Điều này chỉ trả lời câu hỏi "Thư mục làm việc hiện tại của quy trình là $pidgì?" Bài đăng đã chỉnh sửa vẫn không trả lời câu hỏi. whichchỉ đơn thuần nói "Nếu lệnh nằm trên đường dẫn, thì nó là gì?"
John Strood

pwdxtrả lại cho tôi đường dẫn tuyệt đối của chương trình có thể thực hiện được của quá trình tùy thuộc vào pid trên redhat x64 6.3.
Nick Dong

14

Một cách là ps -ef


5
đã không làm việc cho một dịch vụ cụ thể, nó chỉ cung cấp đường dẫn tương đối
Jader Dias

Giúp tôi xác định một quy trình thông qua lệnh mà nó đã được bắt đầu.
jpierson


2

Câu trả lời nhanh là sử dụng psvới các tùy chọn hoặc /procthông tin hệ thống tập tin. Điều đó thường sẽ làm việc, nhưng không được bảo đảm. Nói chung, không có câu trả lời chắc chắn, đảm bảo. Chẳng hạn, nếu tệp thực thi bị xóa trong khi thực thi, do đó không có đường dẫn đến tệp thì sao?

Xem Câu hỏi thường gặp về Unix để biết thêm chi tiết, đặc biệt là các câu hỏi 4.3 và 4.4.


2

Tại sao mọi người mong đợi bạn biết đến PID? Đây là cách thân thiện với con người:

pwdx `pgrep ###process_name###`

Câu hỏi nêu rõ với những gì tôi có thể thấy với ps, vì vậy nó có thể sẽ hiển thị PID
Scz

À đúng rồi. Tôi vẫn thấy đây là một lớp lót nhanh hơn trong nhiều trường hợp sử dụng của tôi.
psychboom

1

lsof là một lựa chọn. Bạn có thể thử một cái gì đó như dưới đây:

lsof -p PROCESS_ID

Điều này sẽ liệt kê tất cả các tệp được mở theo quy trình bao gồm cả vị trí thực tế của tệp thực thi. Sau đó có thể thêm một vài awk, cắt, grep, vv để tìm ra thông tin mà bạn đang tìm kiếm.

Ví dụ, tôi đã thực hiện các lệnh sau để xác định quá trình 'java' của tôi đến từ đâu:

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


Làm thế nào là khác nhau so với câu trả lời đã được đăng chính xác?
Pimp Juice IT

0

Bạn đã có thể sử dụng

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

hoặc là

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

để có được con đường tuyệt đối. PID là quá trình.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.