Jak mogę poznać bezwzględną ścieżkę uruchomionego procesu?

93

Jeśli mam na dysku wiele kopii tej samej aplikacji i działa tylko jedna, jak widzę ps, jak mogę poznać bezwzględną ścieżkę odróżniającą ją od innych?

Jader Dias
źródło

Odpowiedzi:

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

na przykład:

% ps -auxwe | grep 24466
root 24466 0,0 0,0 1476 280? S 2009 0:00 nadzoruje sshd
% sudo ls -l / proc / 24466 / exe
lrwxrwxrwx 1 root root 0 lutego 1 18:05 / proc / 24466 / exe -> /package/admin/daemontools-0.76/command/supervise
akira
źródło
1
W moim systemie (ubuntu 14.04) nie musisz być superużytkownikiem, aby uruchomić lspolecenie.
jarno
3
@jarno ls: cannot read symbolic link /proc/28783/exe: Permission denied- nie chodzi o uruchomienie lspolecenia, chodzi o dostęp do informacji o procesie, który nie należy do ciebie. Na moim urządzeniu około 97% wszystkich procesów wymienionych w / proc to procesy root, a pozostałe są rozmieszczone wśród 11 różnych użytkowników.
Irfy,
20

Posługiwać się:

pwdx $pid

To daje ci bieżący katalog roboczy pid, a nie jego bezwzględną ścieżkę.

Zwykle whichpolecenie powie ci, która jest wywoływana z powłoki:

#> which vlc
/usr/bin/vlc
seenu
źródło
3
ta odpowiedź wymaga większego entuzjazmu ...
Kokizzu
8
@Kokizzu Nie, nie robi, ponieważ w ogóle nie odpowiada na pytanie. Które polecenie mówi tylko, który plik binarny zostanie uruchomiony, jeśli wykonasz polecenie teraz. Pytanie brzmiało: „który plik binarny już tam działa”. Wyobraź sobie na przykład, że masz na komputerze kilkanaście plików JDK. Jeśli chcesz wiedzieć dla działającego procesu java, z którego jdk został pobrany, co nie pomaga w tym. Powie ci tylko, z którego jdk zostanie pobrany, jeśli wykonasz go teraz. Przyjęta odpowiedź jest również poprawna.
noamik
Oczywisty sposób, w jaki ta odpowiedź jest błędna: na moim komputerze uruchamiam procesy z różnymi wersjami JDK i niektórymi wersjami 32-bitowymi / 64-bitowymi. Jeśli chcę zidentyfikować poprawną wersję jstack / jmap dla procesu, powyższa odpowiedź nie będzie działać, a zaakceptowana odpowiedź będzie.
Daniel Da Cunha,
@Kokizzu To tylko odpowiada na pytanie: „Jaki jest bieżący katalog roboczy procesu $pid?” Edytowany post nadal nie odpowiada na pytanie. whichmówi tylko „Jeśli polecenie jest na ścieżce, to co to jest?”
John Strood,
pwdxzwróć mi bezwzględną ścieżkę możliwego do wykonania programu procesu w zależności od pid na redhat x64 6.3.
Nick Dong,
14

Jednym ze sposobów jest ps -ef

fpmurphy
źródło
5
nie działał dla konkretnej usługi, po prostu zapewnia ścieżkę względną
Jader Dias
Pomógł mi zidentyfikować proces za pomocą polecenia, z którym został uruchomiony.
jpierson
2

Szybką odpowiedzią jest użycie psopcji lub /procinformacji o systemie plików. To zwykle działa, ale nie jest gwarantowane. Ogólnie rzecz biorąc, nie ma jednoznacznej, gwarantowanej odpowiedzi. Na przykład, co jeśli plik wykonawczy zostanie usunięty podczas wykonywania, aby nie było ścieżki do pliku?

Zobacz Unix FAQ, aby uzyskać więcej szczegółów, w szczególności pytania 4.3 i 4.4.

mpez0
źródło
2

Dlaczego wszyscy oczekują, że znasz PID? Oto przyjazny dla człowieka sposób:

pwdx `pgrep ###process_name###`
nastrój
źródło
Pytanie brzmi „jak widzę z ps”, więc prawdopodobnie wyświetli PID
Scz
Ach, ok, prawda. Nadal uważam, że jest to szybsza jedna linijka w wielu moich przypadkach użycia.
moodboom
1

lsof jest opcją. Możesz spróbować czegoś takiego:

lsof -p PROCESS_ID

Spowoduje to wyświetlenie listy wszystkich plików otwartych przez proces, w tym faktycznej lokalizacji pliku wykonywalnego. Następnie można dodać jeszcze kilka awk, cut, grep itp., Aby znaleźć informacje, których szukasz.

Jako przykład wykonałem następujące polecenia, aby ustalić, skąd pochodzi mój proces „java”:

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

Baran
źródło
Czym dokładnie różni się to od już opublikowanych odpowiedzi?
Pimp Juice IT,
0

Możesz użyć

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

lub

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

uzyskać absolutną ścieżkę. PID to proces.

jarno
źródło