Linux 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.
…省略部分输出…

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

beylze教程学院,一个分享编程知识和seo亚博足球比分知识的网站。跟着beylze一起学习,每天都有进步。

通俗易懂,深入浅出,一篇文章只讲一个知识点。

文章不深奥,不需要钻研,在公交、在地铁、在厕所都可以阅读,随时随地涨姿势。

文章不涉及代码,不烧脑细胞,人人都可以学习。

当你决定关注beylze,你已然超越了90%的其他从业者!