我怎么知道正在运行的进程的绝对路径?


93

如果在磁盘上有同一个应用程序的多个副本,并且只有一个正在运行(如我所见)ps,我如何知道将其与其他应用程序区分开的绝对路径?

Answers:


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

例如:

%ps -auxwe | grep 24466
根24466 0.0 0.0 1476 280?S 2009 0:00监督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
在我的系统(ubuntu 14.04)中,您不必是超级用户即可运行ls命令。
jarno

3
@jarno- ls: cannot read symbolic link /proc/28783/exe: Permission denied与运行ls命令无关,与访问不属于您的进程的进程信息有关。在我的框中,/ proc中列出的所有进程中约有97%是根进程,其他进程分布在11个不同的用户上。
Irfy

20

采用:

pwdx $pid

这将为您提供pid的当前工作目录,而不是其绝对路径。

通常,该which命令会告诉您从shell调用哪个:

#> which vlc
/usr/bin/vlc

3
这个答案需要更多的给予好评..
Kokizzu

8
@Kokizzu不,不是因为它根本没有回答问题。如果您现在执行命令,则which命令仅告诉您将运行哪个二进制文件。问题是“哪个二进制文件已经在那儿运行了”。例如,假设您的计算机上有一打jdk。如果您想知道一个正在运行的Java进程是从哪个jdk中获取的,这对您没有帮助。如果您现在执行它,它将仅告诉您它将从哪个jdk获取。接受的答案也是正确的答案。
noamik

答案显然是错误的:在我的机器上,我运行具有不同JDK版本和某些32位/ 64位的进程。如果我想为该过程标识正确的jstack / jmap版本,则上述答案将不起作用,而可接受的答案将起作用。
丹尼尔·达库尼亚

@Kokizzu这只能回答以下问题:“该进程的当前工作目录是$pid什么?” 编辑后的帖子仍然无法回答问题。which只告诉“如果命令在路径上,那是什么?”
John Strood

pwdx返回我的进程的可执行程序的绝对路径,取决于redhat x64 6.3上的pid。
尼克·董



2

快速的答案是ps与选项或/proc文件系统信息一起使用。这将平时的工作,但不能保证。通常,没有确定的,有保证的答案。例如,如果在执行过程中删除了执行文件,从而没有文件路径,该怎么办?

有关更多详细信息,请参见Unix FAQ,尤其是问题4.3和4.4。


2

为什么每个人都希望您知道PID?这是人类友好的方式:

pwdx `pgrep ###process_name###`

该问题指出“如我所见ps”,因此它可能会显示PID
Scz Spr

好的,好的。在许多用例中,我仍然认为这是一种更快的方法。
moodboom

1

lsof是一个选项。您可以尝试以下操作:

lsof -p PROCESS_ID

这将列出该进程打开的所有文件,包括可执行文件的实际位置。然后可以添加更多的awk,cut,grep等,以查找所需的信息。

例如,我执行以下命令来确定“ java”过程的来源:

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


这与已经发布的答案有何不同?
Pimp Juice IT

0

你可以用

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

要么

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

获得绝对路径。PID是过程。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.