查找正在运行的进程的当前工作目录
1. 概述
假设我们有两个相似的运行进程,每个进程都在不同的终端中启动,并且都使用相对路径读取文件。
如果我们想知道进程正在读取的确切文件,我们需要找到两者的当前工作目录。
在本教程中,我们将了解如何找到正在运行的进程的当前工作目录 (CWD)。我们将介绍几种查找 CWD 的方法,包括pwdx 和lsof 。此外,我们将阅读 /proc 目录中的 CWD 链接。
2. pwdx
让我们在终端中启动一个简单的过程:
$ sleep 1000 &
[1] 5620
我们使用*&在后台运行sleep 过程,因为我们想在同一个终端中输入其他命令。我们还可以在前台运行sleep* (不带*&*)并打开另一个 shell 以获取更多命令。
让我们使用pwdx命令来识别进程的当前工作目录:
$ pwdx <PID>
由于pwdx需要进程 ID (PID) 来打印sleep的 CWD ,我们将首先使用pgrep 命令找到进程的 PID:
$ pgrep sleep
5620
pgrep的输出是我们进程的 PID。请注意,此数字等于sleep示例中 shell 返回的数字。现在,让我们看看sleep进程的当前工作目录是什么:
$ pwdx 5620
5620: /home/pi
pwdx的 CWD是 /home/pi。
为了理解 CWD 的概念,让我们在运行sleep的同一个终端中运行pwd :
$ pwd
/home/pi
我们可以看到进程的CWD和shell的CWD是一样的。因此,如果我们使用cd进入*/home/pi/Rey路径,然后运行一个新的sleep进程,新进程的 CWD 将是/home/pi/Rey*。当然,上一个过程的CWD不会改变:
$ cd Rey/
$ sleep 2000 &
[2] 23217
$ pwdx 23217
23217: /home/pi/Rey
请注意,** pwdx命令不显示调用进程的位置**。它只显示它当前从哪里运行。另外,请注意,我们可以将多个 PID 传递给pwdx命令并同时获取多个进程的当前工作目录:
$ pwdx 5620 23217
5620: /home/pi
23217: /home/pi/Rey
3. lsof
** lsof(列出打开的文件)命令返回有关当前活动的所有进程的信息**。由于 Linux 中的所有内容都被视为文件,因此我们可以使用此命令获取有关进程的大量信息。让我们用lsof命令找到sleep进程的当前工作目录:
$ lsof -p 5620 | grep cwd
sleep 5620 pi cwd DIR 179,2 4096 1347 /home/pi
我们使用*-p选项和 PID指定休眠进程。正如我们在上一节中提到的,我们可以使用pgrep找到进程的 PID 。由于lsof*的输出包含有关进程的大量信息,因此我们将通过管道将输出限制为 grep 命令,该命令仅打印包含 CWD 的行。
4. 检查*/proc*目录
目录/proc*代表 Linux 中的虚拟文件系统,其中包含运行时系统信息,包括进程信息*。/proc目录中有一些编号的目录,每个目录对应一个实际的进程 ID。因此,可以通过查看该进程的目录(即路径*/proc/PID* )来获取有关该进程的详细信息。
由于我们正在寻找sleep的当前工作目录,因此我们需要查看*/proc/PID路径中的cwd*链接:
$ ls -l /proc/5620/cwd
lrwxrwxrwx 1 pi pi 0 Sep 18 16:52 /proc/5620/cwd -> /home/pi
我们使用ls -l查看目录的详细列表。让我们找到第二个进程的cwd:
$ ls -l /proc/23217/cwd
lrwxrwxrwx 1 pi pi 0 Sep 18 12:58 /proc/23217/cwd -> /home/pi/Rey
结果是到 CWD 的链接。我们还可以使用readlink 命令,它读取并打印*/proc/PID/cwd*中符号链接的内容:
$ readlink -e /proc/23217/cwd
/home/pi/Rey
我们使用readlink的*-e*选项来确保符号链接中的所有组件都存在。