获取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
... ... ... ... ... ... ... ... ... ... ...
在这里,带有选项 a的ps命令 列出了所有用户的所有进程。我们可以通过添加选项 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