首页 > 运维 > linux运维 > 正文

如何查看Linux进程打开文件 lsof命令常用参数解析

P粉602998670
发布: 2025-08-02 14:34:01
原创
1156人浏览过

要查看linux中进程打开的文件或文件被哪个进程占用,可使用lsof命令。1. 查看某进程打开的文件:执行lsof -p pid,如lsof -p 12345;2. 查看某文件被哪些进程打开:执行lsof /path/to/file,如lsof /var/log/syslog;3. 输出解读:包含command、pid、user、fd、type、name等关键列,例如一行输出显示apache2进程(pid 12345)监听80端口;4. 常用参数包括:-i(网络连接)、-u(用户)、-c(命令名)、-t(仅pid)、-n/-p(禁用解析)、+d(目录递归);5. 高级用途:查找已删除但仍被占用的文件(lsof | grep deleted)、解决端口占用问题(lsof -i :3306)、诊断文件描述符耗尽(lsof -p pid | wc -l)、找出阻止卸载的进程(lsof /mnt/data)。掌握这些用法有助于高效排查系统资源问题。

如何查看Linux进程打开文件 lsof命令常用参数解析

在Linux系统里,想知道某个进程到底打开了哪些文件,或者某个文件被哪个进程占用着,

lsof
登录后复制
命令就是你的得力助手。它能列出系统上所有打开的文件,包括普通文件、目录、网络套接字、管道等等,并显示是哪个进程在用它们。可以说,它就是你系统资源使用情况的“透视镜”。

如何查看Linux进程打开文件 lsof命令常用参数解析

解决方案

要查看Linux进程打开的文件,最直接、最常用的方法就是使用

lsof
登录后复制
命令。

比如,如果你想知道PID为12345的进程打开了哪些文件,你可以这样执行:

如何查看Linux进程打开文件 lsof命令常用参数解析
lsof -p 12345
登录后复制

这条命令会列出该进程当前正在使用的所有文件描述符及其对应的文件或网络连接。

如果你想反过来,看看某个文件(比如

/var/log/syslog
登录后复制
)当前被哪些进程打开了,可以这样:

如何查看Linux进程打开文件 lsof命令常用参数解析
lsof /var/log/syslog
登录后复制

这在排查文件被占用、无法删除等问题时特别有用。

lsof 命令的输出信息如何解读?

刚接触

lsof
登录后复制
的朋友,看到它密密麻麻的输出,可能会觉得有点头大。其实,只要抓住几个关键列,就能很快理解其含义。

一条典型的

lsof
登录后复制
输出通常包含以下几列:

  • COMMAND:执行该操作的命令名称。
  • PID:进程的ID。这是我们最常用的一个标识符。
  • USER:进程的所有者用户。
  • FD:文件描述符(File Descriptor)。这是个核心概念。它可能是
    cwd
    登录后复制
    (current working directory,当前工作目录),
    txt
    登录后复制
    (program text,程序代码),
    mem
    登录后复制
    (memory-mapped file,内存映射文件),
    rtd
    登录后复制
    (root directory,根目录), 或者一个数字(比如
    0
    登录后复制
    for stdin,
    1
    登录后复制
    for stdout,
    2
    登录后复制
    for stderr)。后面通常跟着
    r
    登录后复制
    (read),
    w
    登录后复制
    (write),
    u
    登录后复制
    (read/write) 等权限标识。
  • TYPE:文件类型。常见的有
    REG
    登录后复制
    (regular file,普通文件),
    DIR
    登录后复制
    (directory,目录),
    CHR
    登录后复制
    (character special file,字符设备),
    BLK
    登录后复制
    (block special file,块设备),
    FIFO
    登录后复制
    (FIFO special file,命名管道),
    SOCK
    登录后复制
    (socket,套接字)。
  • DEVICE:文件所在的设备号。
  • SIZE/OFF:文件大小或文件偏移量。对于网络文件,这可能表示缓冲区大小。
  • NODE:文件的inode号。
  • NAME:文件或网络连接的完整路径或名称。对于网络连接,它会显示协议、源IP:端口 -> 目标IP:端口,或者状态。

举个例子,如果看到

lsof
登录后复制
输出中有一行是
apache2 12345 www-data 4u IPv4 123456 0t0 TCP *:80 (LISTEN)
登录后复制
,它告诉你:
apache2
登录后复制
这个进程(PID 12345,用户
www-data
登录后复制
)有一个文件描述符
4
登录后复制
,类型是
u
登录后复制
(可读写),它是一个
IPv4
登录后复制
TCP
登录后复制
套接字,监听在所有接口的
80
登录后复制
端口上。理解这些,你就能快速定位问题了。

巧文书
巧文书

巧文书是一款AI写标书、AI写方案的产品。通过自研的先进AI大模型,精准解析招标文件,智能生成投标内容。

巧文书 61
查看详情 巧文书

lsof 常用参数有哪些,它们分别有什么作用?

lsof
登录后复制
的强大之处在于它提供了丰富的参数,让你能按各种条件进行筛选和查找。掌握这些常用参数,能大大提升你的排查效率。

  • -i
    登录后复制
    :列出所有打开的套接字/网络连接。 这是我个人用得最多的参数之一。当你发现服务器某个端口被占用,或者想看看哪些进程在进行网络通信时,
    -i
    登录后复制
    简直是神器。

    • 查看所有网络连接:
      lsof -i
      登录后复制
    • 查看特定端口的连接(比如80端口):
      lsof -i :80
      登录后复制
    • 查看特定IP地址的连接:
      lsof -i @192.168.1.100
      登录后复制
    • 查看特定协议的连接(比如TCP):
      lsof -i TCP
      登录后复制
    • 组合使用:
      lsof -i TCP:80
      登录后复制
      (查看所有TCP协议80端口的连接)
  • -u <username>
    登录后复制
    :列出某个用户打开的文件。 当你需要了解某个用户(比如
    nginx
    登录后复制
    mysql
    登录后复制
    )运行的进程都打开了哪些文件时,这个参数非常方便。

    lsof -u nginx
    登录后复制
  • -c <command>
    登录后复制
    :列出某个命令或进程名打开的文件。 如果你知道进程的命令名,但不知道PID,这个参数就派上用场了。

    lsof -c sshd
    登录后复制

    它会找出所有名为

    sshd
    登录后复制
    的进程打开的文件。

  • -t
    登录后复制
    :只显示PID。 这个参数通常用于脚本中,当你只需要获取PID列表,然后传递给其他命令(比如
    kill
    登录后复制
    )时,它能让输出变得非常简洁。

    kill -9 $(lsof -t -i :8080)
    登录后复制

    这条命令会杀死所有占用8080端口的进程。当然,生产环境操作要慎重。

  • -n
    登录后复制
    :不解析主机名。 在网络连接较多时,
    lsof
    登录后复制
    默认会尝试将IP地址解析成主机名,这可能会导致命令执行缓慢。使用
    -n
    登录后复制
    可以禁用这种解析,加快速度。

    lsof -i -n
    登录后复制
  • -P
    登录后复制
    :不解析端口名。
    -n
    登录后复制
    类似,
    -P
    登录后复制
    会禁用端口号到服务名的解析(比如80端口显示为
    http
    登录后复制
    )。同样是为了提高执行速度。

    lsof -i -P
    登录后复制
  • +D <directory>
    登录后复制
    :递归列出目录下所有被打开的文件。 当你怀疑某个目录下的文件被占用,或者想知道某个服务对特定目录的访问情况时,这个参数很有用。

    lsof +D /var/log
    登录后复制

lsof 在排查系统问题时有哪些高级用法?

lsof
登录后复制
不仅仅是查看文件那么简单,它在系统故障排查中扮演着至关重要的角色。

  • 查找“文件已删除但仍被占用”的情况: 有时候你删除一个文件,但磁盘空间并没有立即释放,或者文件还在被某个进程使用。这通常是因为某个进程还持有这个文件的文件描述符。

    lsof
    登录后复制
    可以帮你找到这些“僵尸”文件:

    lsof | grep deleted
    登录后复制

    输出中带有

    (deleted)
    登录后复制
    标记的文件就是这种情况。找到对应的PID,重启或杀死该进程,文件占用的空间就能释放了。

  • 解决“地址已被使用”错误(Address already in use): 当你尝试启动一个服务,却提示端口已被占用时,

    lsof -i :<port_number>
    登录后复制
    就能快速定位是哪个进程霸占了你的端口。

    lsof -i :3306
    登录后复制

    这能告诉你MySQL的3306端口是不是已经被另一个MySQL实例或者其他什么程序占用了。

  • 诊断“文件描述符耗尽”(Too many open files): 某些应用程序可能会因为打开了过多的文件描述符而崩溃。系统对每个进程可打开的文件描述符数量是有限制的。当遇到这种问题时,你可以用

    lsof -p <PID> | wc -l
    登录后复制
    来粗略统计某个进程打开的文件数量。如果数量非常大,那可能就是这个原因了。

    lsof -p <PID> | wc -l
    登录后复制

    这有助于你调整系统的

    ulimit
    登录后复制
    配置,或者优化应用程序的文件操作。

  • 找出特定文件系统的占用者: 如果你的某个分区无法卸载(unmount),可能是因为上面有文件还在被使用。你可以通过

    lsof /mount/point
    登录后复制
    来查找是哪些进程阻止了卸载。

    lsof /mnt/data
    登录后复制

    这会列出所有在

    /mnt/data
    登录后复制
    挂载点上打开了文件的进程。

总的来说,

lsof
登录后复制
是一个非常强大的诊断工具,它的灵活性和详尽的输出,让它成为Linux系统管理员和开发人员的必备技能之一。虽然刚开始学可能有点枯燥,但一旦你掌握了它,你会发现很多棘手的系统问题都能迎刃而解。

以上就是如何查看Linux进程打开文件 lsof命令常用参数解析的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号