• Linux shell编程学习笔记47:lsof命令


    0 前言

    今天国产电脑提示磁盘空间已耗尽,使用用df命令检查文件系统情况,发现/dev/sda2已使用100%。

    Linux shell编程学习笔记39:df命令icon-default.png?t=N7T8https://blog.csdn.net/Purpleendurer/article/details/135577571于是开始清理磁盘空间。

    第一步是查看已删除、但空间却没有释放的进程。

    这里要用到 lsof命令。

    1 lsof命令的安装

    PurpleEndurer @  bash ~ $ lsof --help
    bash: lsof: command not found
    PurpleEndurer @  bash ~ $ 

     

    lsof 命令默认是没有安装的,如果你的系统中没有安装这个命令,那么可以 使用以下命令安装:

    yum install -y lsof

    PurpleEndurer @  bash ~ $ yum install -y lsof
    Loaded plugins: fastestmirror, ovl
    ovl: Error while doing RPMdb copy-up:
    [Errno 13] Permission denied: '/var/lib/rpm/Providename'
    You need to be root to perform this command.
    PurpleEndurer @  bash ~ $ 
     

     

    2  lsof命令的功能、格式和选项说明

    我们像往常输入lsof --help命令,想查看 lsof命令的帮助信息。

    purpleEndurer @bash ~ $  lsof --help
    lsof: illegal option character: -
    lsof: -e not followed by a file system path: "lp"
    lsof 4.89
     latest revision: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/
     latest FAQ: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/FAQ
     latest man page: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/lsof_man
     usage: [-?abhKlnNoOPRtUvVX] [+|-c c] [+|-d s] [+D D] [+|-E] [+|-e s] [+|-f[gG]]
     [-F [f]] [-g [s]] [-i [i]] [+|-L [l]] [+m [m]] [+|-M] [-o [o]] [-p s]
     [+|-r [t]] [-s [p:s]] [-S [t]] [-T [t]] [-u s] [+|-w] [-x [fl]] [--] [names]
    Defaults in parentheses; comma-separated set (s) items; dash-separated ranges.
      -?|-h list help          -a AND selections (OR)     -b avoid kernel blocks
      -c c  cmd c ^c /c/[bix]  +c w  COMMAND width (9)    +d s  dir s files
      -d s  select by FD set   +D D  dir D tree *SLOW?*   +|-e s  exempt s *RISKY*
      -i select IPv[46] files  -K list tasKs (threads)    -l list UID numbers
      -n no host names         -N select NFS files        -o list file offset
      -O no overhead *RISKY*   -P no port names           -R list paRent PID
      -s list file size        -t terse listing           -T disable TCP/TPI info
      -U select Unix socket    -v list version info       -V verbose search
      +|-w  Warnings (+)       -X skip TCP&UDP* files     -Z Z  context [Z]
      -- end option scan     
      -E display endpoint info              +E display endpoint info and files
      +f|-f  +filesystem or -file names     +|-f[gG] flaGs 
      -F [f] select fields; -F? for help  
      +|-L [l] list (+) suppress (-) link counts < l (0 = all; default = 0)
                                            +m [m] use|create mount supplement
      +|-M   portMap registration (-)       -o o   o 0t offset digits (8)
      -p s   exclude(^)|select PIDs         -S [t] t second stat timeout (15)
      -T qs TCP/TPI Q,St (s) info
      -g [s] exclude(^)|select and print process group IDs
      -i i   select by IPv[46] address: [46][proto][@host|addr][:svc_list|port_list]
      +|-r [t[m]] repeat every t seconds (15);  + until no files, - forever.
           An optional suffix to t is m; m must separate t from  and
           is an strftime(3) format for the marker line.
      -s p:s  exclude(^)|select protocol (p = TCP|UDP) states by name(s).
      -u s   exclude(^)|select login|UID set s
      -x [fl] cross over +d|+D File systems or symbolic Links
      names  select named files or files on named file systems
    Anyone can list all files; /dev warnings disabled; kernel ID check disabled.
    purpleEndurer @bash ~ $ 
     

    尽管 lsof命令不支持--help选项,但给出了帮助信息。

    查看 lsof命令 帮助信息正确选项是 -? 或 -h。

    2.1 命令功能

    lsof 是 List Open File 的缩写, 主要功能是获取和显示被进程打开文件的信息。

    2.2 命令格式

    lsof [-?abhKlnNoOPRtUvVX] [+|-c c] [+|-d s] [+D D] [+|-E] [+|-e s] [+|-f[gG]]
     [-F [f]] [-g [s]] [-i [i]] [+|-L [l]] [+m [m]] [+|-M] [-o [o]] [-p s]
     [+|-r [t]] [-s [p:s]] [-S [t]] [-T [t]] [-u s] [+|-w] [-x [fl]] [--] [names]

    2.3 选项说明

    选项描述
    -h显示帮助信息
    -aAND选择(默认是或)
    -b避免内核块
    -c ccmd c ^c /c/[bix]
    +c w命令宽度(默认为9)
    +d s显示目录集合s下被打开的文件
    -d s通过文件描述符(FD)集合s来选择
    +D D递归处理所有子文件 *慢?*
    +|-e s豁免 s *风险*
    -E显示端点信息
    +E显示端点信息和文件
    +f|-f+文件系统或 -文件名
    +|-f[gG]flaGs
    -F [f]选择字段;-F?寻求帮助
    -g [s]排除(^)或选择并打印进程组ID
    -i 按 IPv[46] 地址选择:[46][proto][@host|addr][:svc_list|port_list]
    -K列出tasKs(线程)
    -l列出UID号
    +|-L [l]列表 (+) 抑制 (-) 链路计数 < l (0 = all; default = 0)
    +m [m]使用或创建安装补充
    +|-M端口映射注册 (-) 
    -n没有主机名
    -N选择NFS文件列表
    -o列出文件偏移量 -o o o 0t 偏移位数(8)
    -O无开销 *风险*
    -p s排除(^)或选择PIDs -S [t]  t秒统计超时(15)
    -P无端口名称
    -R列出paRent PID
    +-r [t[m]]
    -s列表文件大小
    -s p:s排除(^)或选择protocol(p = TCP|UDP) 按名称表示。
    S [t]t 秒统计超时 (默认为15秒)
    -t简洁列表
    -T禁用TCP/TPI信息
    -TqsTCP/TPI Q,St(s)信息
    -u s排除(^)或 选择登录 或 UID集s
    -U选择Unix套接字
    -v显示版本信息
    -V详细搜索
    +|-w    警告
    -x [fl]跨越 +d|+D 文件系统或符号链接
    -X跳过TCP&UDP*文件
    -Z Z上下文[Z]
    --结束选项扫描
    name选择命名文件或命名文件系统上的文件
    • 括号中的是默认值
    • 集合项使用逗号分隔
    • 范围使用破折号分隔

    3 使用实例

    3.1 lsof : 显示当前所有活跃进程打开的所有文件

    显示的内容很多,不好截图。

    3.2 lsof | more:分页显示显示当前所有活跃进程打开的所有文件

    我们可以使用管道操作符和more命令来分实现分页显示

    purpleEndurer @bash / $ lsof | more
    COMMAND     PID   TID             USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
    systemd       1                   root  cwd   unknown                                         /proc/1/cwd (
    readlink: Permission denied)
    systemd       1                   root  rtd   unknown                                         /proc/1/root 
    (readlink: Permission denied)
    systemd       1                   root  txt   unknown                                         /proc/1/exe (
    readlink: Permission denied)
    systemd       1                   root NOFD                                                   /proc/1/fd (o
    pendir: Permission denied)
    kthreadd      2                   root  cwd   unknown                                         /proc/2/cwd (
    readlink: Permission denied)
    kthreadd      2                   root  rtd   unknown                                         /proc/2/root 
    (readlink: Permission denied)
    kthreadd      2                   root  txt   unknown                                         /proc/2/exe (
    readlink: Permission denied)
    kthreadd      2                   root NOFD                                                   /proc/2/fd (o
    pendir: Permission denied)
    ksoftirqd     3                   root  cwd   unknown                                         /proc/3/cwd (
    readlink: Permission denied)
    ksoftirqd     3                   root  rtd   unknown                                         /proc/3/root 
    (readlink: Permission denied)
    ksoftirqd     3                   root  txt   unknown                                         /proc/3/exe (
    readlink: Permission denied)
    ksoftirqd     3                   root NOFD                                                   /proc/3/fd (o
    pendir: Permission denied)
    kworker/0     5                   root  cwd   unknown                                         /proc/5/cwd (
    readlink: Permission denied)
    kworker/0     5                   root  rtd   unknown                                         /proc/5/root 
    (readlink: Permission denied)
     

    命令执行后返回的信息默认有10列,说明如下:

    1. COMMAND:进程名称

    2.PID:进程ID

    3.TID:线程ID

    4.USER:所属用户

    5.FD:文件描述符

    可能的类型以及说明如下:

    FD说明
    cwd当前目录
    txttxt文件
    rtdroot目录
    mem内存映射文件

    6. TYPE:文件类型

    可能的值以及说明如下:

    TYPE说明
    DIR目录
    REG普通文件
    CHR字符
    a_inodeInode文件
    FIFO管道或者socket文件
    netlink网络
    unknown未知

    7.DEVICE:设备ID

    8. SIZE/OFF:进程大小

    9.NODE:文件的Inode号

    10.NAME:路径或者链接

    后面备注(readlink: Permission denied),是因为当前用户相应的访问权限。

    所以使用lsof命令最好有root权限或者赋予普通用于sudo权限。

    3.3 lsof +d proc:显示当前目录下的proc目录中被打开的文件信息

    purpleEndurer @bash / $ lsof +d proc | more
    COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF       NODE NAME
    systemd    2641 gxxc   12r   REG    0,4        0 4026531994 proc/swaps
    lsof      12178 gxxc    3r   DIR    0,4        0          1 proc
    qaxbrowse 14744 gxxc   12r   DIR    0,4        0          1 proc
    qaxbrowse 14770 gxxc   19r   DIR    0,4        0          1 proc
    purpleEndurer @bash / $ 

     

    3.4 lsof +d proc +l:显示当前目录下的proc目录中被打开的文件信息,其中USER列不显示用户名而显示UID

    purpleEndurer @bash / $ lsof +d proc -l | more
    COMMAND     PID     USER   FD   TYPE DEVICE SIZE/OFF       NODE NAME
    systemd    2641     1000   12r   REG    0,4        0 4026531994 proc/swaps
    qaxbrowse 14744     1000   12r   DIR    0,4        0          1 proc
    qaxbrowse 14770     1000   19r   DIR    0,4        0          1 proc
    lsof      14916     1000    3r   DIR    0,4        0          1 proc
    purpleEndurer @bash / $ 

    由于我们使用了 -l选项,所以执行结果中USER列显示的1000是UID

  • 相关阅读:
    leetcode笔记
    Hadoop源码编译打包
    Qt 样式表大全整理
    SpriteAtlas
    SSRF攻击(服务端请求伪造)
    为AI电脑生态注入强悍动力,安耐美PlatiGemini 1200W高性能电源
    试题:最大的矩形(给定直方图里面积最大的矩形)
    自定义qtquick 插件模块,支持qmldesigner
    利用优化算法提高爬虫任务调度效率
    记录一次centos7增加crontab定时任务
  • 原文地址:https://blog.csdn.net/Purpleendurer/article/details/138140027