0

0

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

P粉602998670

P粉602998670

发布时间:2025-08-02 14:34:01

|

1179人浏览过

|

来源于php中文网

原创

要查看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简历制作工具,帮助求职者轻松完成简历制作。

下载

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 
    :列出某个用户打开的文件。 当你需要了解某个用户(比如
    nginx
    mysql
    )运行的进程都打开了哪些文件时,这个参数非常方便。

    lsof -u nginx
  • -c 
    :列出某个命令或进程名打开的文件。 如果你知道进程的命令名,但不知道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 
    :递归列出目录下所有被打开的文件。 当你怀疑某个目录下的文件被占用,或者想知道某个服务对特定目录的访问情况时,这个参数很有用。

    lsof +D /var/log

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

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

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

    lsof
    可以帮你找到这些“僵尸”文件:

    lsof | grep deleted

    输出中带有

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

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

    lsof -i :
    就能快速定位是哪个进程霸占了你的端口。

    lsof -i :3306

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

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

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

    lsof -p  | wc -l

    这有助于你调整系统的

    ulimit
    配置,或者优化应用程序的文件操作。

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

    lsof /mount/point
    来查找是哪些进程阻止了卸载。

    lsof /mnt/data

    这会列出所有在

    /mnt/data
    挂载点上打开了文件的进程。

总的来说,

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

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

664

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

246

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

281

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

515

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

255

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

386

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

530

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

599

2023.08.14

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

19

2026.01.20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.8万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 804人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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