linux 中lsof 命令详解


简介

lsof(List Open Files)是一个用于列出当前系统打开文件的强大工具。在 Linux 环境下,几乎所有事物都以文件的形式存在,包括常规数据、网络连接和硬件设备。因此,系统在后台为每个应用程序分配了一个文件描述符(file descriptor),该文件描述符为应用程序与基础操作系统之间的交互提供了统一的接口。通过 lsof 工具,用户可以查看进程打开的文件列表,这对于系统监测和故障排除非常有帮助。

输出信息含义

在终端中输入 lsof 命令即可显示系统当前打开的文件。由于 lsof 需要访问内核内存和各种文件,通常需要以 root 用户身份运行,以充分发挥其功能。

输出示例

[root@sonar ~]# lsof | head
COMMAND     PID   TID    USER   FD      TYPE             DEVICE   SIZE/OFF       NODE NAME
systemd       1          root  cwd       DIR                8,5       4096         96 /
systemd       1          root  rtd       DIR                8,5       4096         96 /
systemd       1          root  txt       REG                8,5    1628608     353582 /usr/lib/systemd/systemd
systemd       1          root  mem       REG                8,5      20064     299940 /usr/lib64/libuuid.so.1.3.0
systemd       1          root  mem       REG                8,5     265576     266500 /usr/lib64/libblkid.so.1.1.0
systemd       1          root  mem       REG                8,5      90160     299938 /usr/lib64/libz.so.1.2.7
systemd       1          root  mem       REG                8,5     157440     993141 /usr/lib64/liblzma.so.5.2.2
systemd       1          root  mem       REG                8,5      23968       1566 /usr/lib64/libcap-ng.so.0.0.0
systemd       1          root  mem       REG                8,5      19896       1554 /usr/lib64/libattr.so.1.1.0
[root@sonar ~]#

每行代表一个打开的文件,默认情况下,lsof 会显示所有进程打开的所有文件。输出各列的含义如下:

  • COMMAND:进程的名称
  • PID:进程标识符
  • USER:进程所有者
  • FD:文件描述符,应用程序通过此标识符访问文件(如 cwd、txt 等)
  • TYPE:文件类型(如 DIR、REG 等)
  • DEVICE:指定设备名称
  • SIZE:文件大小
  • NODE:索引节点(文件在磁盘上的标识)
  • NAME:打开文件的确切名称

文件描述符解释

  • cwd:当前工作目录
  • txt:程序代码(如可执行文件或共享库)
  • urw:分别表示读、写模式,而大写的 W 表示写锁。文件描述符一般从 0 到 2 开始,分别表示标准输入、输出和错误流。

常用参数

lsof 的基本语法为:

lsof [options] filename

示例命令

  • 查找特定文件的使用情况

    lsof abc.txt  # 显示正在使用 abc.txt 的进程
    
  • 查看特定进程的打开文件

    lsof -c abc  # 显示 abc 进程当前打开的文件
    lsof -p 1234  # 列出进程号为 1234 的进程打开的文件
    
  • 查找某个目录下的打开文件

    lsof +d /usr/local/  # 显示 /usr/local/ 目录下被进程打开的文件
    
  • 网络相关命令

    lsof -i  # 显示所有打开的网络连接
    lsof -i :80  # 显示打开 80 端口的进程
    

使用实例

查找文件系统使用情况

在卸载文件系统时,如果该文件系统中有打开的文件,操作通常会失败。通过 lsof 可以找出正在使用该文件系统的进程。

# lsof /GTES11/
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
bash 4208 root cwd DIR 3,1 4096 2 /GTES11/
vim 4230 root cwd DIR 3,1 4096 2 /GTES11/

安全审计

lsof 在安全审计中也发挥着重要作用。通过列出打开的文件和对应的进程,您可以识别潜在的安全风险。例如,您可以使用 lsof 检查哪些用户正在访问敏感文件,或者检测可疑的进程是否在访问关键系统文件:

lsof /etc/shadow  # 检查哪个进程在访问系统密码文件

这种方式对于确保系统安全性至关重要,尤其是在处理敏感数据时。

与其他工具结合使用

lsof 可以与其他命令和工具结合使用,以增强监控和故障排除能力。例如,将 lsoftop 结合,您可以获取实时的系统性能数据:

top -c | grep `lsof -p <PID> | awk '{print $9}'`

这样可以更直观地了解进程的资源占用情况。

性能考虑

在高负载环境下,使用 lsof 可能会对系统性能产生影响,因为它需要访问内核内存并扫描文件描述符。因此,建议在非高峰时段使用 lsof,或者使用其输出重定向到文件的方式,减少对终端的影响:

lsof > /tmp/lsof_output.txt

实用命令

lsof `which httpd`  # 查找使用 Apache 可执行文件的进程
lsof /etc/passwd  # 查找占用 /etc/passwd 的进程
lsof -c sendmail  # 查看 sendmail 进程的文件使用情况
lsof -u^tony  # 查看不是用户 tony 的进程的文件使用情况

总结

lsof 是 Linux 系统中不可或缺的工具,能够高效地列出当前系统中所有打开的文件及其对应的进程信息。通过利用 lsof,用户不仅可以监控系统资源的使用情况,还能诊断和解决各种问题,例如确认进程是否占用了特定文件、查看网络连接的状态以及恢复已删除的文件等。结合实际应用案例、故障排除技巧和与其他工具的配合,lsof 的使用将为系统管理员提供强大的支持,使其能够有效管理和维护复杂的 Linux 环境。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XMYX-0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值