Contents

获取Linux中进程的路径

1. 概述

在本教程中,我们将讨论如何在 Linux 中查找进程的路径。众所周知,每个进程都有一个唯一的PID 。我们可以使用该 PID 来获取任何进程的路径。

2.寻找PID

我们可以借助ps 命令获取进程的 PID。

让我们启动一个编辑器进程并使用ps命令获取它的 PID :

$ gedit test.c 
$ ps aux
USER      PID   %CPU  %MEM      VSZ    RSS   TTY   STAT  START  TIME  COMMAND
...      ...     ...   ...     ...    ...    ...   ...    ...   ...     ...
HARDIK  10899    2.3   1.3   797076  42716 pts/1    Sl   01:49  0:00  gedit test.c
...      ...     ...   ...     ...    ...    ...   ...    ...   ...     ...

在这里,带有选项 aps命令 列出了所有用户的所有进程。我们可以通过添加选项 u来查看进程的用户。此外,选项 x将包括没有控制终端的进程。但是,发出此命令可能会打印出大量有关进程的数据行。

因此,从上面的输出中,我们可以看到我们新创建的进程的 PID 是 10899。我们将使用这个 PID 来获取所需的信息。

此外,我们可以使用 ps 命令和 grep  命令结合使用它的名称来列出我们的进程:

$ ps aux | grep gedit
HARDIK  10899    2.3   1.3   797076  42716 pts/1    Sl   01:49  0:00  gedit test.c

3. 寻找进程路径

3.1. proc文件系统和exe符号链接

有关进程的信息存储在/proc目录下,也称为proc 文件系统。在此目录中,每个进程将其数据存储在以其 PID 命名的子目录中。

如果我们列出proc文件系统中的目录,我们会看到许多以数字命名的目录。这些只不过是进程的 PID:

$ ls /proc
1     11772  1400  174   199   219   245  283  320  359  397  46    650  85   interrupts
10    11773  141   175   1991  22    246  284  321  36   398  47    651  86   iomem
100   11780  142   1754  2     220   247  285  322  360  399  48    652  87   ioports
101   118    143   1755  20    221   248  286  323  361  40   486   653  878  irq
102   119    144   1756  200   222   249  287  324  362  400  49    654  879  kallsyms
...   ...    ...   ...   ...   ...   ...  ...  ...  ...  ...  ...   ...  ...  ...

此外,如果我们列出以我们之前创建的进程的 PID 命名的目录的内容,我们可以看到一些目录和符号链接:

$ ls -a /proc/10899/
.          clear_refs       environ  latency    mountinfo   oom_adj        root       stat     uid_map
..         cmdline          exe      limits     mounts      oom_score      sched      statm    wchan
attr       comm             fd       loginuid   mountstats  oom_score_adj  schedstat  status
autogroup  coredump_filter  fdinfo   map_files  net         pagemap        sessionid  syscall
auxv       cpuset           gid_map  maps       ns          personality    smaps      task
cgroup     cwd              io       mem        numa_maps   projid_map     stack      timers

符号链接是包含文本字符串的文件,该文件采用引用另一个文件或目录的路径形式。其中,符号链接exe包含执行命令的实际路径名。我们可以通过阅读这个符号链接来获得我们进程的路径。

接下来,我们将看到使用其 PID 和符号链接获取进程路径的不同方法。

3.2. 使用readlink命令和exe符号链接

readlink 命令显示解析的符号链接或规范文件名的值

在这里,当我们读取exe符号链接时,它会返回gedit可执行文件的路径:

$ readlink /proc/10899/exe
/usr/bin/gedit

因此,从上面的输出中可以清楚地看出,编辑器是从*/usr/bin/*目录执行的。

此外,我们可以使用详细选项 ( v ) 列出错误消息(如果有)。例如,如果我们输入了错误的 PID,它不存在,它会显示一条错误消息:

$ readlink -v /proc/10890/exe
readlink: /proc/10890/exe: No such file or directory

3.3. 使用realpath命令和exe符号链接

**或者,我们可以使用realpath 命令。**此命令打印给定符号链接的解析路径:

$ realpath /proc/10899/exe
/usr/bin/gedit

3.4. 使用ls命令和exe符号链接

我们也可以使用ls命令,列出目录内容。通过将ls与长列表选项(l)结合使用,我们可以知道进程的路径:

$ ls -l /proc/10899/exe
lrwxrwxrwx 1 HARDIK users 0 Feb 23 01:49 /proc/10899/exe -> /usr/bin/gedit