zoukankan      html  css  js  c++  java
  • linux lsof用法

    一直不大了解linux的用法,最近重学Linux,记录一下:

    转自:http://c.biancheng.net/view/1088.html

    我们知道,通过 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.
    …省略部分输出…

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

  • 相关阅读:
    第十二章学习笔记
    UVa OJ 107 The Cat in the Hat (戴帽子的猫)
    UVa OJ 123 Searching Quickly (快速查找)
    UVa OJ 119 Greedy Gift Givers (贪婪的送礼者)
    UVa OJ 113 Power of Cryptography (密文的乘方)
    UVa OJ 112 Tree Summing (树的求和)
    UVa OJ 641 Do the Untwist (解密工作)
    UVa OJ 105 The Skyline Problem (地平线问题)
    UVa OJ 100 The 3n + 1 problem (3n + 1问题)
    UVa OJ 121 Pipe Fitters (装管子)
  • 原文地址:https://www.cnblogs.com/linwenbin/p/11487086.html
Copyright © 2011-2022 走看看