在本文中,我们将解释如何找出谁在 Linux 中使用特定文件。这将帮助您了解正在使用打开文件的系统用户或进程。
我们可以使用lsof 命令来了解是否有人正在使用某个文件,如果是,是谁在使用。它在搜索打开的文件时读取内核内存,并帮助您列出所有打开的文件。在这种情况下,一个打开的文件可能是一个常规文件、一个目录、一个块特殊文件、一个字符特殊文件、一个流、一个网络文件等等——因为在Linux 中一切都是文件。
Lsof用于文件系统,以识别谁正在使用该文件系统上的任何文件。您可以在 Linux 文件系统上运行lsof 命令,输出会标识使用该文件的进程的所有者和进程信息,如以下输出所示。
$ lsof /dev/null
Linux 中所有打开的文件列表
命令 PID 用户 FD 类型 设备大小/关闭 节点名称 systemd 1480 示例 0r CHR 1,3 0t0 6 /dev/null sh 1501 示例 0r CHR 1,3 0t0 6 /dev/null sh 1501 示例 1w CHR 1,3 0t0 6 /dev/null dbus-daem 1530 示例 0u CHR 1,3 0t0 6 /dev/null xfce4-ses 1603 示例 0r CHR 1,3 0t0 6 /dev/null xfce4-ses 1603 示例 1w CHR 1,3 0t0 6 /dev/null at-spi-bu 1604 示例 0r CHR 1,3 0t0 6 /dev/null dbus-daem 1609 示例 0u CHR 1,3 0t0 6 /dev/null at-spi2-r 1611 示例 0u CHR 1,3 0t0 6 /dev/null xfconfd 1615 示例 0u CHR 1,3 0t0 6 /dev/null xfwm4 1624 示例 0r CHR 1,3 0t0 6 /dev/null xfwm4 1624 示例 1w CHR 1,3 0t0 6 /dev/null xfce4-pan 1628 示例 0r CHR 1,3 0t0 6 /dev/null xfce4-pan 1628 示例 1w CHR 1,3 0t0 6 /dev/null Thunar 1630 示例 0r CHR 1,3 0t0 6 /dev/null Thunar 1630 示例 1w CHR 1,3 0t0 6 /dev/null xfdesktop 1632 示例 0r CHR 1,3 0t0 6 /dev/null xfdesktop 1632 示例 1w CHR 1,3 0t0 6 /dev/null ....
要列出用户特定的打开的文件,请运行以下命令并将其替换example
为实际用户名。
$ lsof -u 示例
用户打开的文件列表
命令 PID 用户 FD 类型 设备大小/关闭 节点名称 systemd 1480 示例 cwd DIR 8,3 4096 2 / systemd 1480 示例 rtd DIR 8,3 4096 2 / systemd 1480 示例 txt REG 8,3 1595792 3147496 /lib/systemd/systemd systemd 1480 示例 mem REG 8,3 1700792 3150525 /lib/x86_64-linux-gnu/libm-2.27.so systemd 1480 示例 mem REG 8,3 121016 3146329 /lib/x86_64-linux-gnu/libudev.so.1.6.9 systemd 1480 示例 mem REG 8,3 84032 3150503 /lib/x86_64-linux-gnu/libgpg-error.so.0.22.0 systemd 1480 示例 mem REG 8,3 43304 3150514 /lib/x86_64-linux-gnu/libjson-c.so.3.0.1 systemd 1480 示例 mem REG 8,3 34872 2497970 /usr/lib/x86_64-linux-gnu/libargon2.so.0 systemd 1480 示例 mem REG 8,3 432640 3150484 /lib/x86_64-linux-gnu/libdevmapper.so.1.02.1 systemd 1480 示例 mem REG 8,3 18680 3150450 /lib/x86_64-linux-gnu/libattr.so.1.1.0 systemd 1480 示例 mem REG 8,3 18712 3150465 /lib/x86_64-linux-gnu/libcap-ng.so.0.0.0 systemd 1480 示例 mem REG 8,3 27112 3150489 /lib/x86_64-linux-gnu/libuuid.so.1.3.0 systemd 1480 示例 mem REG 8,3 14560 3150485 /lib/x86_64-linux-gnu/libdl-2.27.so ...
lsof的另一个重要用途是找出侦听特定端口的进程。例如,使用以下命令识别侦听端口80的进程。
$ sudo lsof -i TCP:80
找出进程监听端口
命令 PID 用户 FD 类型 设备大小/关闭 节点名称 httpd 903 root 4u IPv6 20222 0t0 TCP *:http(监听) httpd 1320 apache 4u IPv6 20222 0t0 TCP *:http(监听) httpd 1481 apache 4u IPv6 20222 0t0 TCP *:http(监听) httpd 1482 apache 4u IPv6 20222 0t0 TCP *:http(监听) httpd 1493 apache 4u IPv6 20222 0t0 TCP *:http(监听) httpd 1763 apache 4u IPv6 20222 0t0 TCP *:http(监听) httpd 2027 apache 4u IPv6 20222 0t0 TCP *:http(监听) httpd 2029 apache 4u IPv6 20222 0t0 TCP *:http(监听) httpd 2044 apache 4u IPv6 20222 0t0 TCP *:http(监听) httpd 3199 apache 4u IPv6 20222 0t0 TCP *:http(监听) httpd 3201 apache 4u IPv6 20222 0t0 TCP *:http(监听)
注意:由于lsof在搜索打开的文件时会读取内核内存,因此内核内存的快速更改可能会导致不可预测的输出。这是使用lsof 命令的主要缺点之一。
有关更多信息,请查看lsof手册页:
$ 人 lsof
就这样!在本文中,我们解释了如何知道谁在 Linux 中使用特定文件。我们展示了如何使用打开的文件来识别进程的所有者和进程信息。如有任何问题或意见,请使用下面的反馈表联系我们。