精华内容
下载资源
问答
  • Linux lsof命令使用详解

    2021-01-09 21:36:55
    所以 lsof 命令不仅可以查看进程打开的文件、目录,还可以查看进程监听的端口等 socket 相关的信息。本文将介绍 lsof 命令的基本用法,本文中 demo 的演示环境为 ubuntu 18.04。 常用选项 -a 指示其它选项之间为与的...
  • 主要介绍了linux lsof命令详解的相关资料,lsof是一个列出当前系统打开文件的工具,这里详细介绍如何使用,需要的朋友可以参考下
  • 在介绍lsof命令之前,先简单说一下,linux主要有哪些文件: 普通文件 目录 符号链接 面向块的设备文件 面向字符的设备文件 管道和命名管道 套接字 以上各类文件类型不多做详细介绍。 lsof命令实用用法介绍 ...
  • Linux lsof命令

    2019-03-21 01:43:08
    NULL 博文链接:https://paninxb.iteye.com/blog/951912
  • lsof命令 lsof命令用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需要root用户执行。 在...
  • lsof命令用于查看进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需要root用户执行。 在linux环境下,...
  • 概述:lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。如TC和UDP等,系统在后台都为该应用程序...

    概述:

    lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。如TC和UDP等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。

    52694b15c77602418b841c45bdcbd926.png

    linux 命令行操作视图

    1. lsof

    查看进程打开文件、端口等信息, 需root权限运行, 一个很尴尬的事情是这么好用的工具,在很多Linux发行版上居然不是自带,不过该工具安装非诚简单,执行yum/apt-get -y install lsof 即可

    # 查看使用该目录或文件的进程

    lsof dir | file

    如lsof /usr/sbin/sshd

    lsof +d /usr/local/ 仅查看当前指定目录

    lsof +D /usr/local/ 查看当前目录及其子目录

    # 据进程id查看进程打开的文件,多个进程id用逗号隔开

    lsof -p pid

    如 lsof -p 2601,2602,2603

    # 查看本机所有网络连接

    lsof-i[tcp|udp]

    # 查看占用tcp端口80的程序

    lsof-itcp:80

    # 查看占用端口10~1024范围内的进程

    lsof -i tcp:10-1024

    # 列出某个IP的连接信息

    lsof -i @192.168.88.100

    # 列出某个用户打开的文件信息

    lsof -u root

    # 列出某个用户的所有活跃的网络端口

    lsof -a -u root -i

    # 查看那些已被删除但仍未被释放的文件

    lsof | grep deleted

    # 每隔三秒查看一次访问本机端口22,80的网络连接情况

    lsof -i @192.168.31.100:22,80 -r 3

    # 查看本机所有程序打开文件数最多的前20个程序

    lsof | awk '{print $2 " " $1}' | sort | uniq -c | sort -nr | head -20

    展开全文
  • lsof命令

    2021-07-16 14:04:00
    查看被占用文件描述符 查看所有被占用文件描述符,已经被占用的的进程; lsof 文件描述符 | 运行程序路径 | 打开文件路径

    查看被占用文件描述符

    查看所有被占用文件描述符,已经被占用的的进程;

    lsof
    

    在这里插入图片描述
    文件描述符 | 运行程序路径 | 打开文件路径


    Linux查看进程打开多少文件描述符命令-lsof

    展开全文
  • lsof命令详解

    千次阅读 2019-09-07 20:34:22
    lsof命令详解 一、命令介绍 lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件,如TCP和UDP等。...
    原文地址:https://www.cpweb.top/345

    lsof命令详解

    一、命令介绍

    lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件,如TCP和UDP等。系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。

    参数含义
    -c列出指定进程打开的文件
    -a进行与运算
    -d列出为某文件描述符的文件
    +d列出目录下被打开的文件
    +D递归列出目录下被打开的文件
    -n列出使用NFS的文件
    -i列出符合条件的进程。(4、6、协议、:端口、 @ip )
    -p列出指定进程号所打开的文件
    -g列出归属gid的进程详情
    -u列出归属uid的进程详情
    -t仅显示进程号
    -n不做名字解析

    二、输出信息含义

    [root@server ~]# lsof
    COMMAND    PID  TID     USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
    systemd      1          root  cwd       DIR              253,0      4096        128 /
    systemd      1          root  rtd       DIR              253,0      4096        128 /
    systemd      1          root  txt       REG              253,0   1523624  201648993 /usr/lib/systemd/systemd
    systemd      1          root  mem       REG              253,0     20032  134327260 /usr/lib64/libuuid.so.1.3.0
    systemd      1          root  mem       REG              253,0    252704  134328361 /usr/lib64/libblkid.so.1.1.0
    systemd      1          root  mem       REG              253,0     90632  134327251 /usr/lib64/libz.so.1.2.7
    systemd      1          root  mem       REG              253,0    153192  134741572 /usr/lib64/liblzma.so.5.0.99
    systemd      1          root  mem       REG              253,0     19888  134327335 /usr/lib64/libattr.so.1.1.0
    systemd      1          root    0u      CHR                1,3       0t0       1028 /dev/null
    systemd      1          root    1u      CHR                1,3       0t0       1028 /dev/null
    systemd      1          root    2u      CHR                1,3       0t0       1028 /dev/null
    systemd      1          root    3u  a_inode                0,9         0       6835 [timerfd]
    systemd      1          root    4u  a_inode                0,9         0       6835 [eventpoll]
    systemd      1          root    5u  a_inode                0,9         0       6835 [signalfd]
    systemd      1          root    6r      DIR               0,21         0       8681 /sys/fs/cgroup/systemd
    systemd      1          root    7u  a_inode                0,9         0       6835 [timerfd]
    systemd      1          root    8u  netlink                          0t0      10099 KOBJECT_UEVENT
    systemd      1          root    9r      REG                0,3         0       8914 /proc/1/mountinfo
    systemd      1          root   10r  a_inode                0,9         0       6835 inotify
    dockerd-c 1540 1988     root  mem       REG              253,0    164432  134317357 /usr/lib64/ld-2.17.so
    dockerd-c 1540 1988     root  mem-W     REG              253,0     32768  135461345 /var/lib/docker/volumes/metadata.db
    dockerd-c 1540 1988     root  mem       REG              253,0     83208  135478261 /usr/lib64/libudev.so.1.6.2
    
    COMMAND:进程的名称
        PID:进程标识符
        USER:进程所有者
        FD:文件描述符,应用程序通过文件描述符识别该文件。这里列举几个
               •  cwd 表示应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改
               •  txt   该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /usr/lib/systemd/systemd
               •  rtd   根目录
               • mem 内存映射文件
               • 0       标准输出
               • 1       标准输入
               • 2       标准错误
           注:数值表示应用程序的文件描述符,这是打开该文件时返回的一个整数,如上的/proc/1/mountinfo,其文件描述符为9。
               而一般在标准输出、标准错误、标准输入后还跟着文件状态模式:r、w、u。u 表示该文件被打开并处于读取/写入模式,r表示只读,w表示只写。
               该文件描述符用于确保每次只能打开一个应用程序实例。初始打开每个应用程序时,都具有三个文件描述符,从 0 到 2,分别表示标准输入、输出和错误流。
               所以大多数应用程序所打开的文件的 FD 都是从 3 开始 ,同时还有大写 的W 表示该应用程序具有对整个文件的写锁   
        
        TYPE:文件类型
               •  DIR      表示目录
               •  CHR     表示字符类型
               •  BLK      块设备类型
               •  UNIX    UNIX 域套接字
               •  FIFO    先进先出 (FIFO) 队列
               •  IPv4     网际协议 (IP) 套接字
                             
        DEVICE:指定磁盘的名称
        SIZE:文件的大小
        NODE:索引节点(文件在磁盘上的标识)
        NAME:打开文件的确切名称
    

    三、实例演示

    使用-c参数,列出vsftpd进程打开的文件

    [root@server ~]# lsof -c vsftpd
    COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF      NODE NAME
    vsftpd  1544 root  cwd    DIR  253,0     4096       128 /
    vsftpd  1544 root  rtd    DIR  253,0     4096       128 /
    vsftpd  1544 root  txt    REG  253,0   171248 135478222 /usr/sbin/vsftpd
    vsftpd  1544 root  mem    REG  253,0   398272 134327237 /usr/lib64/libpcre.so.1.2.0
    vsftpd  1544 root  mem    REG  253,0   155744 134327248 /usr/lib64/libselinux.so.1
    vsftpd  1544 root  mem    REG  253,0   142296 134741550 /usr/lib64/libpthread-2.17.so
    vsftpd  1544 root  mem    REG  253,0   110808 134741552 /usr/lib64/libresolv-2.17.so
    vsftpd  1544 root  mem    REG  253,0    15688 134327652 /usr/lib64/libkeyutils.so.1.5
    vsftpd  1544 root  mem    REG  253,0    62720 134328180 /usr/lib64/libkrb5support.so.0.1
    vsftpd  1544 root  mem    REG  253,0    19888 134327335 /usr/lib64/libattr.so.1.1.0
    vsftpd  1544 root  mem    REG  253,0   118792 134327256 /usr/lib64/libaudit.so.1.0.0
    vsftpd  1544 root  mem    REG  253,0    90632 134327251 /usr/lib64/libz.so.1.2.7
    vsftpd  1544 root  mem    REG  253,0   202576 134328168 /usr/lib64/libk5crypto.so.3.1
    vsftpd  1544 root  mem    REG  253,0    15840 134327267 /usr/lib64/libcom_err.so.2.1
    vsftpd  1544 root  mem    REG  253,0   950496 134328178 /usr/lib64/libkrb5.so.3.3
    vsftpd  1544 root  mem    REG  253,0   316528 134328165 /usr/lib64/libgssapi_krb5.so.2.2
    vsftpd  1544 root  mem    REG  253,0  2107816 134317364 /usr/lib64/libc-2.17.so
    vsftpd  1544 root  mem    REG  253,0  2012880 134328195 /usr/lib64/libcrypto.so.1.0.1e
    vsftpd  1544 root  mem    REG  253,0    19512 134317370 /usr/lib64/libdl-2.17.so
    vsftpd  1544 root  mem    REG  253,0    20024 134327294 /usr/lib64/libcap.so.2.22
    vsftpd  1544 root  mem    REG  253,0    61648 134329026 /usr/lib64/libpam.so.0.83.1
    vsftpd  1544 root  mem    REG  253,0   113320 134317374 /usr/lib64/libnsl-2.17.so
    vsftpd  1544 root  mem    REG  253,0    42520 134327602 /usr/lib64/libwrap.so.0.7.6
    vsftpd  1544 root  mem    REG  253,0   449864 134328197 /usr/lib64/libssl.so.1.0.1e
    vsftpd  1544 root  mem    REG  253,0   164432 134317357 /usr/lib64/ld-2.17.so
    vsftpd  1544 root    3u  IPv6  18330      0t0       TCP *:ftp (LISTEN)
    

    使用-u参数,列出root用户打开的文件,只列出前10行

    [root@server ~]# lsof -u root | head -n 10
    COMMAND    PID USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
    systemd      1 root  cwd       DIR              253,0      4096        128 /
    systemd      1 root  rtd       DIR              253,0      4096        128 /
    systemd      1 root  txt       REG              253,0   1523624  201648993 /usr/lib/systemd/systemd
    systemd      1 root  mem       REG              253,0     20032  134327260 /usr/lib64/libuuid.so.1.3.0
    systemd      1 root  mem       REG              253,0    252704  134328361 /usr/lib64/libblkid.so.1.1.0
    systemd      1 root  mem       REG              253,0     90632  134327251 /usr/lib64/libz.so.1.2.7
    systemd      1 root  mem       REG              253,0    153192  134741572 /usr/lib64/liblzma.so.5.0.99
    systemd      1 root  mem       REG              253,0     19888  134327335 /usr/lib64/libattr.so.1.1.0
    systemd      1 root  mem       REG              253,0     19512  134317370 /usr/lib64/libdl-2.17.so
    

    使用-p参数,列出指定进程号打开的文件,这里以docker为例。

    [root@server ~]# netstat -anpt | grep docker
    tcp6       0      0 :::5000                 :::*                    LISTEN      2968/docker-proxy-c 
    tcp6       0      0 :::8080                 :::*                    LISTEN      2946/docker-proxy-c 
    [root@server ~]# lsof -p 2968
    COMMAND    PID USER   FD      TYPE DEVICE SIZE/OFF       NODE NAME
    docker-pr 2968 root  cwd       DIR  253,0     4096        128 /
    docker-pr 2968 root  rtd       DIR  253,0     4096        128 /
    docker-pr 2968 root  txt       REG  253,0  1697904      23974 /usr/libexec/docker/docker-proxy-current
    docker-pr 2968 root  mem       REG  253,0  2107816  134317364 /usr/lib64/libc-2.17.so
    docker-pr 2968 root  mem       REG  253,0   142296  134741550 /usr/lib64/libpthread-2.17.so
    docker-pr 2968 root  mem       REG  253,0   164432  134317357 /usr/lib64/ld-2.17.so
    docker-pr 2968 root    0r      CHR    1,3      0t0       1028 /dev/null
    docker-pr 2968 root    1w      CHR    1,3      0t0       1028 /dev/null
    docker-pr 2968 root    2w      CHR    1,3      0t0       1028 /dev/null
    docker-pr 2968 root    4u     IPv6  21080      0t0        TCP *:commplex-main (LISTEN)
    docker-pr 2968 root    5u  a_inode    0,9        0       6835 [eventpoll]
    docker-pr 2968 root   11r      REG    0,3        0 4026531956 net
    docker-pr 2968 root   12u  netlink             0t0      20226 ROUTE
    docker-pr 2968 root   13u  netlink             0t0      20227 XFRM
    

    使用-d参数列出FD为txt的文件,仅显示后10行。

    [root@server ~]# lsof -d txt | tail -n 10
    kworker/u 5801     root txt   unknown                           /proc/5801/exe
    kworker/0 5984     root txt   unknown                           /proc/5984/exe
    kworker/0 6016     root txt   unknown                           /proc/6016/exe
    pickup    6044  postfix txt       REG  253,0   285112  67755903 /usr/libexec/postfix/pickup
    kworker/u 6067     root txt   unknown                           /proc/6067/exe
    git       6074     root txt       REG  253,3  1577288  46261462 /usr/bin/git
    git-remot 6075     root txt       REG  253,3   872424     96329 /usr/lib/git-core/git-remote-http
    lsof      6077     root txt       REG  253,0   154072 164789835 /usr/sbin/lsof
    tail      6078     root txt       REG  253,0    66776  67245119 /usr/bin/tail
    lsof      6079     root txt       REG  253,0   154072 164789835 /usr/sbin/lsof
    

    使用+d参数列出目录下被打开的文件,使用+D参数递归列出目录下被打开的文件。

    [root@server ~]# lsof +d /usr/sbin
    COMMAND    PID USER  FD   TYPE DEVICE SIZE/OFF      NODE NAME
    lvmetad    752 root txt    REG  253,0    52872 134698281 /usr/sbin/lvmetad
    auditd     887 root txt    REG  253,0   141592 135338685 /usr/sbin/auditd
    irqbalanc  913 root txt    REG  253,0    49624 134698013 /usr/sbin/irqbalance
    rsyslogd   917 root txt    REG  253,0   555400 134698082 /usr/sbin/rsyslogd
    crond      923 root txt    REG  253,0    70096 134621005 /usr/sbin/crond
    agetty     931 root txt    REG  253,0    36840 134534408 /usr/sbin/agetty
    NetworkMa 1027 root txt    REG  253,0  1944184 134697928 /usr/sbin/NetworkManager
    wpa_suppl 1139 root txt    REG  253,0  1451632 134697601 /usr/sbin/wpa_supplicant
    sshd      1539 root txt    REG  253,0   815520 135338852 /usr/sbin/sshd
    vsftpd    1544 root txt    REG  253,0   171248 135478222 /usr/sbin/vsftpd
    sshd      3365 root txt    REG  253,0   815520 135338852 /usr/sbin/sshd
    lsof      6100 root txt    REG  253,0   154072 164789835 /usr/sbin/lsof
    lsof      6101 root txt    REG  253,0   154072 164789835 /usr/sbin/lsof
    [root@server ~]# lsof +D /usr/lib/
    COMMAND    PID    USER  FD   TYPE DEVICE  SIZE/OFF      NODE NAME
    systemd      1    root txt    REG  253,0   1523624 201648993 /usr/lib/systemd/systemd
    systemd-j  735    root txt    REG  253,0    274752 201649007 /usr/lib/systemd/systemd-journald
    systemd-u  753    root txt    REG  253,0    361496 201649021 /usr/lib/systemd/systemd-udevd
    systemd-u  753    root mem    REG  253,0    387028  68047258 /usr/lib/modules/3.10.0-327.el7.x86_64/modules.symbols.bin
    systemd-u  753    root mem    REG  253,0    681768  67402263 /usr/lib/modules/3.10.0-327.el7.x86_64/modules.alias.bin
    systemd-u  753    root mem    REG  253,0    316220  68047255 /usr/lib/modules/3.10.0-327.el7.x86_64/modules.dep.bin
    systemd-u  753    root mem    REG  253,0      7744  68047259 /usr/lib/modules/3.10.0-327.el7.x86_64/modules.builtin.bin
    firewalld  915    root mem    REG  253,0 106065056 134741571 /usr/lib/locale/locale-archive
    systemd-l  918    root txt    REG  253,0    572320 201766817 /usr/lib/systemd/systemd-logind
    crond      923    root mem    REG  253,0 106065056 134741571 /usr/lib/locale/locale-archive
    

    lsof -i还可以列出网络连接信息,可以达到类似于netstat命令的效果

    [root@server ~]# lsof -i
    COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    sshd      1567 root    3u  IPv4  18815      0t0  TCP *:ssh (LISTEN)
    sshd      1567 root    4u  IPv6  18824      0t0  TCP *:ssh (LISTEN)
    vsftpd    1574 root    3u  IPv6  18759      0t0  TCP *:ftp (LISTEN)
    master    2549 root   13u  IPv4  19353      0t0  TCP localhost:smtp (LISTEN)
    master    2549 root   14u  IPv6  19354      0t0  TCP localhost:smtp (LISTEN)
    docker-pr 2929 root    4u  IPv6  22279      0t0  TCP *:commplex-main (LISTEN)
    docker-pr 2967 root    4u  IPv6  22423      0t0  TCP *:webcache (LISTEN)
    sshd      3321 root    3u  IPv4  32892      0t0  TCP server:ssh->192.168.200.1:49781 (ESTABLISHED)
    [root@server ~]#  netstat -atp
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
    tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN      1567/sshd           
    tcp        0      0 localhost:smtp          0.0.0.0:*               LISTEN      2549/master         
    tcp        0     52 server:ssh              192.168.200.1:49781     ESTABLISHED 3321/sshd: root@pts 
    tcp6       0      0 [::]:commplex-main      [::]:*                  LISTEN      2929/docker-proxy-c 
    tcp6       0      0 [::]:webcache           [::]:*                  LISTEN      2967/docker-proxy-c 
    tcp6       0      0 [::]:ftp                [::]:*                  LISTEN      1574/vsftpd         
    tcp6       0      0 [::]:ssh                [::]:*                  LISTEN      1567/sshd           
    tcp6       0      0 localhost:smtp          [::]:*                  LISTEN      2549/master         
    

    使用-i 6显示TYPE为ipv6的连接

    [root@server ~]# lsof -i 6
    COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    sshd      1567 root    4u  IPv6  18824      0t0  TCP *:ssh (LISTEN)
    vsftpd    1574 root    3u  IPv6  18759      0t0  TCP *:ftp (LISTEN)
    master    2549 root   14u  IPv6  19354      0t0  TCP localhost:smtp (LISTEN)
    docker-pr 2929 root    4u  IPv6  22279      0t0  TCP *:commplex-main (LISTEN)
    docker-pr 2967 root    4u  IPv6  22423      0t0  TCP *:webcache (LISTEN)
    

    使用-i tcp获取协议为tcp的连接

    [root@server ~]# lsof -i tcp
    COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    sshd      1567 root    3u  IPv4  18815      0t0  TCP *:ssh (LISTEN)
    sshd      1567 root    4u  IPv6  18824      0t0  TCP *:ssh (LISTEN)
    vsftpd    1574 root    3u  IPv6  18759      0t0  TCP *:ftp (LISTEN)
    master    2549 root   13u  IPv4  19353      0t0  TCP localhost:smtp (LISTEN)
    master    2549 root   14u  IPv6  19354      0t0  TCP localhost:smtp (LISTEN)
    docker-pr 2929 root    4u  IPv6  22279      0t0  TCP *:commplex-main (LISTEN)
    docker-pr 2967 root    4u  IPv6  22423      0t0  TCP *:webcache (LISTEN)
    sshd      3321 root    3u  IPv4  32892      0t0  TCP server:ssh->192.168.200.1:49781 (ESTABLISHED)
    

    使用-i :22来获取端口为22的连接

    [root@server ~]# lsof -i :22
    COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    sshd    1567 root    3u  IPv4  18815      0t0  TCP *:ssh (LISTEN)
    sshd    1567 root    4u  IPv6  18824      0t0  TCP *:ssh (LISTEN)
    sshd    3321 root    3u  IPv4  32892      0t0  TCP server:ssh->192.168.200.1:49781 (ESTABLISHED)
    

    使用@host来显示指定到指定主机的连接

    [root@server ~]# lsof -n -i @192.168.200.20
    COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    sshd    3321 root    3u  IPv4  32892      0t0  TCP 192.168.200.20:ssh->192.168.200.1:49781 (ESTABLISHED)
    

    使用-a参数联合-d和-c参数,不添加-a参数,命令是不能执行的

    [root@server ~]#  lsof -c vsftpd -a -d txt
    COMMAND  PID USER  FD   TYPE DEVICE SIZE/OFF      NODE NAME
    vsftpd  1574 root txt    REG  253,0   171248 135478222 /usr/sbin/vsftpd
    
    展开全文
  • Linux lsof 命令

    2020-02-19 09:24:15
    Linux lsof 命令

    lsof(list open files): 一个查看进程打开的文件的工具。

    在 linux 系统中,一切皆文件。通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以 lsof 命令不仅可以查看进程打开的文件、目录,还可以查看进程监听的端口等 socket 相关的信息。本文将介绍 lsof 命令的基本用法

     

    常用选项

    • -a: 指示其它选项之间为与的关系
    • -c <进程名>: 输出指定进程所打开的文件
    • -d <文件描述符>: 列出占用该文件号的进程
    • +d <目录>: 输出目录及目录下被打开的文件和目录(不递归)
    • +D <目录>: 递归输出及目录下被打开的文件和目录
    • -i <条件>: 输出符合条件与网络相关的文件
    • -n: 不解析主机名
    • -p <进程号>: 输出指定 PID 的进程所打开的文件
    • -P: 不解析端口号
    • -t: 只输出 PID
    • -u: 输出指定用户打开的文件
    • -U: 输出打开的 UNIX domain socket 文件
    • -h: 显示帮助信息
    • -v: 显示版本信息

     

    基本输出

    • COMMAND:程序的名称
    • PID:进程标识符
    • USER:进程所有者
    • FD:文件描述符,应用程序通过文件描述符识别该文件
    • TYPE:文件类型,如 DIR、REG 等
    • DEVICE:以逗号分隔设备编号
    • SIZE:文件的大小(bytes)
    • NODE:索引节点(文件在磁盘上的标识)
    • NAME:打开文件的确切名称

    FD 列中的常见内容有 cwd、rtd、txt、mem 和一些数字等等。其中 cwd 表示当前的工作目录;rtd 表示根目录;txt
    表示程序的可执行文件;mem 表示内存映射文件。
    还有一部分 FD 是以数字表示的,比如标准输入输出文件: 数字后面的字母表示进程对该文件的读写模式,比如上图中的 u 表示该文件被打开并处于读取/写入模式。除了 u,还有 r 表示只读模式,w 表示只写模式,还可以同时应用 W 表示该进程拥有对文件写操作的锁。

    TYPE 列中常见的 REG 和 DIR 分别表示普通文件和目录。而 CHR 和 BLK 则分别表示字符和块设备,unix、fifo 和 IPv4/IPv6
    分别表示 UNIX domain 套接字、先进先出(FIFO)队列和 IPv4/IPv6 套接字。

     

    常见用法

    查看哪些进程打开了某个文件

    直接指定文件的名称作为 lsof 的参加就可以查看哪些进程打开了这个文件,下面的命令查询打开了 /bin/bash 文件的进程

    sudo lsof /bin/bash 
    

    除了普通文件,也可以是设备等文件(下面命令的输出很长,图示只是截取的一小部分)

    sudo lsof /dev/sda1 
    

     

    查看哪些进程打开了某个目录及目录下的文件

    +d 选项不执行递归查询,只查找那些打开了指定目录以及指定目录下文件和目录的进程

    sudo lsof +d /var/log
    

    +D 选项则会对指定的目录进行递归

    sudo lsof +D /var/log 
    

    在卸载文件系统时,如果有进程打开了该文件系统中的文件或目录,卸载操作就会失败。因此最好在卸载文件系统前通过 lsof +D 检查文件系统的挂载点,杀掉相关的进程然后再执行卸载操作。

     

    查看某个进程打开的所有文件

    通过 -p 选项并指定进程的 PID 可以输出该进程打开的所有文件。

    比如我们想要查看 cron 程序打开的文件,可以先用 ps -C cron 命令查出进程的 PID, 然后把该 PID 传递给 lsof 命令的 -p 选项

    sudo lsof -p 1152 
    

     

    组合多个选项

    如果为 lsof 命令指定多个选项,这些选项间默认是或的关系。也就是说满足任何一个选项的结果都会被输出。可以添加额外的 -a 选项,它的作用就是让其它选项之间的关系变为与

    sudo lsof -a -p $$ -d0,1,2 
    

    其中的 -p 选项指定了当前进程的 PID,而 -d 选项则用来指定进程打开的文件描述符(可以通过逗号分隔多个文件描述符)。添加 -a 选项后,结果输出为当前进程打开的文件描述符为 0、1、2 的文件。

    说明,-a 选项的使用有很多条件,具体请参考 lsof man page

     

    查看指定名称的程序打开的文件

    通过 -c 选项可以匹配进程运行的程序(可执行文件)名称。比如我们要查找以字母 cr 开头的程序打开的文件列表

    sudo lsof -c cr 
    

    还可以同时指定多个 -c 选项,它们之间是或的关系。

    如果想对 -c 选项的条件取反,只要在字符串前添加符号 ^ 就可以了

    sudo lsof -c ^cr 
    

    -c 选项也支持正则表达式,比如下面的命令可以过滤出以 cra 和 cro 开头的程序打开的文件

    sudo lsof -c /cr[ao]/ 
    

     

    查看被打开的与网络相关的文件

    -i 选项用来查看被打开的和网络相关的文件,其参数的格式如下:

    [46][protocol][@hostname|hostaddr][:service|port]

    • 46 表示 IP 协议的版本
    • protocol 表示网络协议的名称,比如 TCP 或 UDP
    • hostname 或 hostaddr 表示主机地址
    • service 指 /etc/services 中的名称,比如 smtp 或多个服务的列表
    • port 表示端口号,可以指定一个或多个
    # -i 选项默认会同时输出 IPv4 和 IPv6 打开的文件
    sudo lsof -i 
    
    # 只列出 IPv4 或 IPv6 打开的文件
    sudo lsof -i 4
    sudo lsof -i 6 
    
    # 列出与 22 号端口相关的文件
    sudo lsof -i:22
    
    # 列出指定范围内被打开的 TCP 端口
    sudo -i TCP:1-1024 
    

     

    查看被打开的 UNIX domain socket 文件

    -U 选项输出打开的 UNIX domain socket 文件,这里我们结合 -c 选项来查看 ssh 服务打开的 UNIX domain socket 文件

    sudo lsof -a -c sshd -U 
    

     

    查看某个用户打开的所有文件

    -u 选项可以指定用户名或 user ID,并且和 -c 选项一样,可以通过逗号分隔多个用户名称或 user ID,也可以通过符号 ^ 对条件取反

    # 查看某个用户打开的所有文件
    sudo lsof -u syslog
    
    # 查看用户 nick 打开的网络相关的文件
    sudo lsof -a -i -u nick
    
    # 排除某个用户
    sudo lsof -i -u ^nick 
    

    注意:在有排除条件时,不需要指定 -a 选项。

     

    # 杀掉某个用户打开了文件的所有进程
    kill -9 $(lsof -t -u nick) 
    

    该命令中的 -t 选项让 lsof 命令只输出进程的 PID

    # 统计系统打开的文件总数
    sudo lsof -P -n | wc -l 
    

    命令中的 -P 选项表示不解析端口号,-n 选项表示不解析主机名,这两个选项主要的目的是为了提升 lsof 命令的执行速度。wc -l 命令则用来统计 lsof 命令输出的行数。

     

    恢复删除的文件

    如果我们一不小心删除了文件,而又知道这个文本被某个进程打开着,就可以通过 lsof 命令来恢复该文件。具体的原理为:

    当进程打开了某个文件时,只要该进程保持打开该文件,即使将文件删除,它依然存在于磁盘中。进程并不知道文件已经被删除,它仍然可以通过打开该文件时提供给它的文件描述符进行读取和写入。除了该进程之外,这个文件是不可见的,因为已经删除了其相应的目录索引节点。

    进程打开的文件描述符就存放在 /proc/PID/fd 目录下。/proc

    目录挂载的是在内存中所映射的一块区域,所以这些文件和目录并不存在于磁盘中,因此当我们对这些文件进行读取和写入时,实际上是在从内存中获取相关信息。lsof

    程序就是使用这些信息和其他关于内核内部状态的信息来产生其输出。所以 lsof

    可以显示进程的文件描述符和相关的文件名等信息。也就是说我们通过访问进程的文件描述符可以找到该文件的相关信息。

    下面的 demo 演示如何通过 lsof 命令恢复被误删的 /var/log/syslog 文件。

    先删除日志文件 /var/log/syslog,记着要提前备份一下这个文件,以防万一

    sudo rm /var/log/syslog 
    

    从上面的信息可以看到 PID 为 1141 的进程打开着该文件,文件描述符为 7,并且显示该文件已经被删除了。接下来我们通过 1141 号进程的文件文件描述符来查看该文件的内容

    sudo tail -n 5 /proc/1141/fd/7 
    

    上图说明文件 /var/log/syslog 文件的内容还在,并且可以通过文件描述符访问,接下来通过 IO 重定向的方式重新创建 /var/log/syslog 文件就可以了

    sudo sh -c 'cat /proc/1141/fd/7 > /var/log/syslog' 
    

    然后修复文件的权限属性并重启 rsyslog 服务

    sudo chown syslog:adm /var/log/syslog
    
    sudo systemctl restart rsyslog.service 
    

    这样就完成了 /var/log/syslog 文件的恢复工作。对于许多应用程序,尤其是日志文件和数据库文件,都可以通过这种方式来恢复。

    具体操作案例: linux lsof 命令恢复被误删的文件

     

    处理磁盘已满但找不到对应的大文件的问题

    df -h 查磁盘满了, 但又找不到的大文件, 什么原因? 百思不得其解, 于是请教。

    原来,进程打开了一个大文件, 被删除后, 并没有释放。 重启进程后, 才释放。 用 lsof | grep deleted 查一下即可知道是哪个进程。

     

    参考网址

    展开全文
  • 1、lsof命令简介lsof是list open files的简称,它的作用主要是列出系统中打开的文件,基本上linux系统中所有的对象都可以看作文件,lsof可以查看用户和进程操作了哪些文件,也可以查看系统中网络的使用情况,以及...
  • 交叉编译完成的lsof命令,适合在arm-cpu架构的服务器上使用
  • linux lsof命令

    2019-04-04 14:03:09
    1、lsof命令简介lsof是list open files的简称,它的作用主要是列出系统中打开的文件,基本上linux系统中所有的对象都可以看作文件,lsof可以查看用户和进程操作了哪些文件,也可以查看系统中网络的使用情况,以及...
  • lsof 命令解析

    2020-02-10 15:38:45
    lsof lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报...
  • linux中lsof命令详解

    2020-06-01 20:21:37
    有趣的是,lsof也是有着最多开关的Linux/Unix命令之一。它有那么多的开关,它有许多选项支持使用-和+前缀。 选项描述 -a列出打开文件存在的进程; -c<进程名>列出指定进程所打开的文件; -g列出GID号进程...
  • 之前听人说过,不能在同一个坑...h 显示内存大小 sudo 用root权限执行 lsof -i检查网络端口 ps -e 显示进程 top检测进程 nvidia-smi 显示gpu占用情况 Ubuntu Bug E: Could not open lock file /var/lib/apt/lists/lock ...
  • lsof命令安装使用

    2020-11-17 20:41:22
    部署spark集群时发现7077端口无法绑定,于是准备查看端口占用情况 lsof -i 7077 竟然提示lsof命令找不到,简直不能容忍 于是yum果断安装 yum install lsof
  • linux lsof命令详解.docx

    2020-01-03 15:30:51
    linux lsof命令详解.docx
  • linux没有lsof命令

    万次阅读 2018-02-06 15:00:21
    [root@root bin]# lsof -i:80 -bash: lsof: command not found 执行下面命令进行安装: yum install lsof 安装过程如图
  • lsof命令使用

    2018-09-13 13:58:22
    lsof命令使用详解: http://czmmiao.iteye.com/blog/1734384 查看已删除空间却没有释放的进程 https://www.linuxidc.com/Linux/2017-06/144975.htm
  • lsof命令 安装 使用

    2018-05-26 17:06:00
    lsof命令用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)。总之是个很牛逼的工具。 我在一次定位目录被进程占用问题时用到,特此总结一下。 首先如下地址下载lsof命令的源码包 ...
  • lsof命令的应用

    千次阅读 2019-02-12 20:12:56
    一、lsof命令 lsof命令用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需要root用户执行。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 41,136
精华内容 16,454
关键字:

lsof命令