Linux进程管理 lsof命令:列出进程调用或打开的文件信息

lsof命令

通过 ps 命令查询到系统中所有的进程, 通过lsof 命令可以知道这个进程到底在调用哪些文件。lsof 命令格式如下:

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

选项:

  • -c 字符串: 只列出以字符串开头的进程打开的文件;
  • +d 目录名: 列出某个目录中所有被进程调用的文件;
  • -u 用户名: 只列出某个用户的进程打开的文件;
  • -p pid: 列出某个 PID 进程打开的文件;

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

[root@localhost ~]# lsof |more
COMMAND     PID  TID           USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
systemd       1                root  cwd       DIR              253,0      4096          2 /
systemd       1                root  rtd       DIR              253,0      4096          2 /
systemd       1                root  txt       REG              253,0   1489960     405924 /usr/lib/systemd/systemd
systemd       1                root  mem       REG              253,0     20032     398342 /usr/lib64/libuuid.so.1.3.0

 按照 PID,从 1 号进程开始列出系统中所有的进程正在调用的文件名。

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

[root@localhost ~]# lsof /usr/lib/systemd/systemd
COMMAND PID USER  FD   TYPE DEVICE SIZE/OFF   NODE NAME
systemd   1 root txt    REG  253,0  1489960 405924 /usr/lib/systemd/systemd

lsof 命令也可以查询某个文件被哪个进程调用。

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

[root@localhost ~]# lsof +d /usr/lib
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rpc.idmap 1196 root mem REG 83 26400 279930   /usr/lib/libnfsidmap.so.0.3.0
rpc.idmap 1196 root mem REG 83 108948 276696  /usr/lib/libevent-1.4.so.2.1.3
avahi-dae 1240 avahi mem REG 83 49124 271310  /usr/lib/libavahi-common.so.3.5.1
avahi-dae 1240 avahi mem REG 83 23904 283188  /usr/lib/libdaemon.so.0.5.0
avahi-dae 1240 avahi mem REG 83 227212 268396 /usr/lib/libavahi-core.so.6.0.1
avahi-dae 1241 avahi mem REG 83 49124 271310  /usr/lib/libavahi-common.so.3.5.1
avahi-dae 1241 avahi mem REG 83 23904 283188  /usr/lib/libdaemon.so.0.5.0
avahi-dae 1241 avahi mem REG 83 227212 268396 /usr/lib/libavahi-core.so.6.0.1
cupsd 1251 root mem REG 83 69564 270210   /usr/lib/libtasn1.so.3.1.6

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

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

[root@localhost ~]# lsof -c httpd
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
httpd 4689 root cwd DIR 83 4096 2 /
httpd 4689 root rtd DIR 83 4096 2 /
httpd 4689 root txt REG 83 1797559 2855  /usr/local/apache2/bin/httpd
httpd 4689 root mem REG 83 302300 665303 /lib/libfreebl3.so
httpd 4689 root mem REG 83 58704 655087  /lib/libnss_files-2.12.s
httpd 4689 root mem REG 83 142472 665291 /lib/ld-2.12.so
httpd 4689 root mem REG 83 1889704 665292 /lib/libc-2.12.so
…省略部分输出…

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

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

[root@localhost ~]# lsof -p 1
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root cwd DIR 83 4096 2 /
init 1 root rtd DIR 83 4096 2 /
init 1 root txt REG 83 145180 130874 /sbin/init
init 1 root mem REG 83 142472 665291 /lib/ld-2.12.so
init 1 root mem REG 83 58704 655087 /lib/libnss_files-2.12.so

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

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

[root@localhost ~]# lsof -u root
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root cwd DIR 83 4096 2 /
init 1 root rtd DIR 83 4096 2 /
init 1 root txt REG 83 145180 130874 /sbin/init
init 1 root mem REG 83 142472 665291 /lib/ld-2.12.so
init 1 root mem REG 83 58704 655087/lib/libnss_files-2.12.s
init 1 root mem REG 83 38768 655310/lib/libnih-dbus.so.1.0.
…省略部分输出…

查看某个用户的进程调用了哪些文件。