lsof命令

我们知道,通过 ps 命令可以查询到系统中所有的进程,那么,是否可以进一步知道这个进程到底在调用哪些文件吗?当然可以,使用 lsof 命令即可。

lsof 命令,“list opened files”的缩写,直译过来,就是列举系统中已经被打开的文件。通过 lsof 命令,我们就可以根据文件找到对应的进程信息,也可以根据进程信息找到进程打开的文件。

lsof 命令的基本格式如下:

[root@localhost ~]# lsof [选项]

此命令常用的选项及功能,如表 1 所示。

表 1 lsof 命令常用选项及功能

选项功能

-c 字符串只列出以字符串开头的进程打开的文件。

+d 目录名列出某个目录中所有被进程调用的文件。

-u 用户名只列出某个用户的进程打开的文件。

-p pid列出某个 PID 进程打开的文件。

【例 1】

[root@localhost ~]# lsof | more

#查询系统中所有进程调用的文件

COMMAND PID  USER  FD    TYPE  DEVICE  SIZE/OFF  NODE  NAME

init               1      root    cwd  DIR    8,3       4096        2           /

init               1      root    rtd    DIR    8,3       4096        2           /

init               1      root    txt     REG   8,3       145180    130874 /sbin/init

init               1      root    mem REG   8,3       142472    665291 /lib/ld-2.12.so

init               1      root    mem REG   8,3       58704      655087 /lib/libnss_files-2.12.so

…省略部分输出…

这个命令的输出非常多。它会按照 PID,从 1 号进程开始列出系统中所有的进程正在调用的文件名。

【例 2】

[root@localhost ~]# lsof /sbin/init

#查询某个文件被哪个进程调用

COMMAND PID USER  FD  TYPE  DEVICE  SIZE/OFF  NODE    NAME

init               1     root    txt  REG   8,3      145180     130874   /sbin/init

lsof 命令也可以反过来查询某个文件被哪个进程调用。这个例子就查询到 /sbin/init 文件是被 init 进程调用的。

【例 3】

[root@localhost ~]# lsof +d /usr/lib

#查询某个目录下所有的文件是被哪些进程调用的

COMMAND  PID    USER   FD     TYPE DEVICE  SIZE/OFF   NODE    NAME

rpc.idmap     1196  root     mem REG  8,3       26400       279930   /usr/lib/libnfsidmap.so.0.3.0

rpc.idmap     1196  root     mem REG  8,3       108948     276696   /usr/lib/libevent-1.4.so.2.1.3

avahi-dae     1240  avahi    mem REG  8,3       49124       271310   /usr/lib/libavahi-common.so.3.5.1

avahi-dae     1240  avahi    mem REG  8,3       23904       283188   /usr/lib/libdaemon.so.0.5.0

avahi-dae     1240  avahi    mem REG  8,3       227212     268396   /usr/lib/libavahi-core.so.6.0.1

avahi-dae     1241  avahi    mem REG  8,3       49124       271310   /usr/lib/libavahi-common.so.3.5.1

avahi-dae     1241  avahi    mem REG  8,3       23904       283188   /usr/lib/libdaemon.so.0.5.0

avahi-dae     1241  avahi    mem REG  8,3       227212     268396   /usr/lib/libavahi-core.so.6.0.1

cupsd           1251  root      mem REG  8,3       69564       270210   /usr/lib/libtasn1.so.3.1.6

使用“+d”选项可以搜索某个目录下所有的文件,查看到底哪个文件被哪个进程调用了。

【例 4】

[root@localhost ~]# lsof -c httpd

#查看以httpd开头的进程调用了哪些文件

COMMAND PID   USER   FD    TYPE   DEVICE  SIZE/OFF  NODE   NAME

httpd           4689 root     cwd  DIR     8,3       4096        2           /

httpd           4689 root     rtd    DIR     8,3       4096        2           /

httpd           4689 root     txt     REG    8,3       1797559  2855     /usr/local/apache2/bin/httpd

httpd           4689 root     mem REG    8,3       302300    665303 /lib/libfreebl3.so

httpd           4689 root     mem REG    8,3       58704      655087 /lib/libnss_files-2.12.s

httpd           4689 root     mem REG    8,3       142472    665291 /lib/ld-2.12.so

httpd           4689 root     mem REG    8,3       1889704  665292 /lib/libc-2.12.so

…省略部分输出…

使用“-c”选项可以查询以某个字符串开头的进程调用的所有文件,比如执行“lsof-c httpd”命令就会查询出以 httpd 开头的进程调用的所有文件。

【例 5】

[root@localhost ~]# lsof -p 1

#查询PID是1的进程调用的文件

COMMAND PID USER FD   TYPE  DEVICE  SIZE/OFF NODE  NAME

init               1     root  cwd  DIR    8,3      4096        2           /

init               1     root rtd     DIR    8,3      4096        2           /

init               1     root  txt     REG   8,3      145180    130874 /sbin/init

init               1     root  mem REG   8,3      142472    665291 /lib/ld-2.12.so

init               1     root  mem REG   8,3      58704      655087 /lib/libnss_files-2.12.so

当然,我们也可以按照 PID 查询进程调用的文件,比如执行“lsof -p 1”命令就可以查看 PID 为 1 的进程调用的所有文件。

【例 6】

[root@localhost ~]# lsof -u root

#按照用户名查询某个用户的进程调用的文件

COMMAND PID USER  FD      TYPE   DEVICE   SIZE/OFF   NODE  NAME

init               1     root    cwd    DIR     8,3       4096          2           /

init               1     root    rtd      DIR     8,3       4096          2           /

init               1     root    txt      REG     8,3       145180     130874  /sbin/init

init               1     root    mem  REG     8,3       142472     665291  /lib/ld-2.12.so

init               1     root    mem  REG     8,3       58704       655087  /lib/libnss_files-2.12.s

init               1     root    mem  REG     8,3       38768       655310  /lib/libnih-dbus.so.1.0.

…省略部分输出…

我们还可以查看某个用户的进程调用了哪些文件。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • lsof (list open files)是一个列出当前系统打开文件的工具。在linux系统环境下,任何事物都可...
    Michael_林阅读 1,524评论 0 0
  • lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的...
    jerrik阅读 392评论 0 1
  • lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的...
    StarShift阅读 895评论 0 0
  • 一、简介 lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物...
    益初阅读 437评论 0 1
  • 残缺的扉页 续不上完整的故事 黑白的画笔 绘不出彩色的梦境 太美的承诺 终究成了追忆的怀念
    安忆梦阅读 167评论 0 0