首页 > 编程笔记 > Linux笔记 阅读:133

Linux lsof命令详解(附带实例)

我们可以通过 ps 命令查询到系统中所有的进程,那么,是否可以知道这个进程到底在调用哪些文件呢?这时就需要 lsof 命令的帮助了,其格式如下:
[root@localhost ~]# lsof [选项]
选项:
【实例 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)的进程调用了哪些文件。

相关文章