Linux lsof命令详解(附带实例)
我们可以通过 ps 命令查询到系统中所有的进程,那么,是否可以知道这个进程到底在调用哪些文件呢?这时就需要 lsof 命令的帮助了,其格式如下:
【实例 1】查询系统中所有进程调用的文件。
lsof 命令的输出非常多。它根据 PID,从 PID 为 1 的进程开始,列出系统中所有的进程正在调用的文件名。
【实例 2】查询某个文件被哪个进程调用。
lsof 命令也可以用来查询某个文件被哪个进程调用。下面的例子就查询到 /sbin/init/usr/lib/systemd/systemd 文件是被 systemd 进程调用的。
【实例 3】查询某个目录中所有的文件是被哪些进程调用的。
【实例 4】查看以 httpd 开头的进程调用了哪些文件。
【实例 5】查询 PID 是 1 的进程调用的文件
【实例 6】按照用户名查询某个用户的进程调用的文件。
[root@localhost ~]# lsof [选项]选项:
- -c 字符串:只列出以字符串开头的进程打开的文件;
- +d 目录名:列出某个目录中所有被进程调用的文件;
- -u 用户名:只列出某个用户的进程打开的文件;
- -p pid:列出某个 PID 对应的进程打开的文件。
【实例 1】查询系统中所有进程调用的文件。
[root@localhost ~]# lsof | more COMMAND PID TID TASKCMD USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd 1 root cwd DIR 8,3 256 128 / systemd 1 root rtd DIR 8,3 256 128 / systemd 1 root txt REG 8,3 1945080 16953143 /usr/lib/systemd/systemd systemd 1 root mem REG 8,3 582217 50341032 /etc/selinux/targeted/contexts/files/file_contexts.bin systemd 1 root mem REG 8,3 45416 242875 /usr/lib64/libffi.so.8.1.0 ...(省略部分输出)...
lsof 命令的输出非常多。它根据 PID,从 PID 为 1 的进程开始,列出系统中所有的进程正在调用的文件名。
【实例 2】查询某个文件被哪个进程调用。
[root@localhost ~]# lsof /usr/lib/systemd/systemd COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd 1 root txt REG 8,3 1945080 16953143 /usr/lib/systemd/systemd systemd 1074 root txt REG 8,3 1945080 16953143 /usr/lib/systemd/systemd (sd-pam) 1076 root txt REG 8,3 1945080 16953143 /usr/lib/systemd/systemd
lsof 命令也可以用来查询某个文件被哪个进程调用。下面的例子就查询到 /sbin/init/usr/lib/systemd/systemd 文件是被 systemd 进程调用的。
【实例 3】查询某个目录中所有的文件是被哪些进程调用的。
[root@localhost ~]# lsof +d /usr/lib64/ | more COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd 1 root mem REG 8,3 45416 242875 /usr/lib64/libffi.so.8.1.0 systemd 1 root mem REG 8,3 153600 242785 /usr/lib64/libgpg-error.so.0.32.0 systemd 1 root mem REG 8,3 28568 242838 /usr/lib64/libattr.so.1.1.2501 systemd 1 root mem REG 8,3 102552 217427 /usr/lib64/libz.so.1.2.11 systemd 1 root mem REG 8,3 32528 242757 /usr/lib64/libcap-ng.so.0.0.0 ...(省略部分输出)...使用 +d 选项可以搜索某个目录中所有的文件,查看到底哪个文件被哪个进程调用了。
【实例 4】查看以 httpd 开头的进程调用了哪些文件。
[root@localhost ~]# lsof -c httpd COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME httpd 1548 root cwd DIR 8,3 256 128 / httpd 1548 root rtd DIR 8,3 256 128 / httpd 1548 root txt REG 8,3 585736 939007 /usr/sbin/httpd httpd 1548 root DEL REG 0,1 26 /dev/zero httpd 1548 root mem REG 8,3 65216 17067366 /usr/lib64/httpd/modules/mod_proxy_http2.so httpd 1548 root mem REG 8,3 4459096 471090 /usr/lib64/libcrypto.so.3.0.1 ...(省略部分输出)...使用 -c 选项可以查询以某个字符串开头的进程调用的所有文件,例如,执行“lsof-c httpd”命令就会查询出以 httpd 开头的进程调用的所有文件。
【实例 5】查询 PID 是 1 的进程调用的文件
[root@localhost ~]# lsof -p 1 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd 1 root cwd DIR 8,3 256 128 / systemd 1 root rtd DIR 8,3 256 128 / systemd 1 root txt REG 8,3 1945080 16953143 /usr/lib/systemd/systemd systemd 1 root mem REG 8,3 582217 50341032 /etc/selinux/targeted/contexts/xfiles/file_contexts.bin ...(省略部分输出)...当然,我们也可以按照 PID 查询进程调用的文件,例如,执行“lsof-p 1”命令就可以查看 PID 为 1 的进程调用的所有文件。
【实例 6】按照用户名查询某个用户的进程调用的文件。
[root@localhost ~]# lsof -u root | more COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd 1 root cwd DIR 8,3 256 128 / systemd 1 root rtd DIR 8,3 256 128 / systemd 1 root txt REG 8,3 1945080 16953143 /usr/lib/systemd/systemd systemd 1 root mem REG 8,3 582217 50341032 /etc/selinux/targeted/contexts/files/file_contexts.bin systemd 1 root mem REG 8,3 45416 242875 /usr/lib64/libffi.so.8.1.0 systemd 1 root mem REG 8,3 153600 242785 /usr/lib64/libgpg-error.so.0.32.0 systemd 1 root mem REG 8,3 28568 242838 /usr/lib64/libattr.so.1.1.2501 ...(省略部分输出)...我们还可以查看某个用户(如 root)的进程调用了哪些文件。