如何知道正在运行的进程的绝对路径?

Jad*_*ias 116 linux process ps

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

aki*_*ira 144

% sudo ls -l /proc/PID/exe
Run Code Online (Sandbox Code Playgroud)

例如:

% 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

  • @jarno `ls: 无法读取符号链接 /proc/28783/exe: Permission denied`——这不是关于运行 `ls` 命令,而是关于访问不属于你的进程的进程信息。在我的机器上,/proc 中列出的所有进程中约有 97% 是 root 进程,其他进程分布在 11 个不同的用户上。 (5认同)
  • 在我的系统 (ubuntu 14.04) 中,您不必是超级用户即可运行 `ls` 命令。 (2认同)

小智 26

用:

pwdx $pid
Run Code Online (Sandbox Code Playgroud)

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

通常which命令会告诉你哪个是从 shell 调用的:

#> which vlc
/usr/bin/vlc
Run Code Online (Sandbox Code Playgroud)

  • @Kokizzu 不,不是,因为它根本没有回答问题。which 命令只会告诉您如果您现在执行该命令,将运行哪个二进制文件。问题是“哪个二进制文件已经在那里运行”。想象一下,例如在您的计算机上有十几个 jdks。如果你想知道一个正在运行的 java 进程是从哪个 jdk 中获取的,这对你没有帮助。如果您现在执行它,它只会告诉您它将从哪个 jdk 中提取。接受的答案也是正确的答案。 (13认同)

fpm*_*phy 19

一种方法是 ps -ef

  • 不适用于特定服务,它只是提供相对路径 (6认同)

小智 7

lsof是一个选项。您可以尝试如下所示:

lsof -p PROCESS_ID
Run Code Online (Sandbox Code Playgroud)

这将列出该进程打开的所有文件,包括可执行文件的实际位置。然后可以添加更多awkcutgrep来查找您正在寻找的信息。

例如,我执行了以下命令来识别我的“java”进程来自何处:

lsof -p 12345 | awk '{print $NF}' | grep 'java$'
Run Code Online (Sandbox Code Playgroud)


Jad*_*ias 5

ps auxwwwe
Run Code Online (Sandbox Code Playgroud)

来源:

https://serverfault.com/questions/62322/getting-full-path-of-executables-in-ps-auxwww-output

  • 没有在我的 linux 上显示所有完整的限定路径:例如“root 24466 0.0 0.0 1476 280 ? S 2009 0:00 supervise sshd” (3认同)