菜鸟-创作你的创作

lsof工具详解

好的,我们来系统讲解一下 lsof 工具,它是 Linux/Unix 系统中非常重要的命令行工具,主要用于查看 系统中被打开的文件。我会从概念、安装、常用用法、实战场景和注意事项全方位说明。


lsof 工具详解

1️⃣ 什么是 lsof?


2️⃣ 安装 lsof

大部分 Linux 发行版默认带有 lsof,如果没有可以手动安装:

# Ubuntu / Debian
sudo apt install lsof

# CentOS / RHEL / Fedora
sudo yum install lsof

安装完成后:

lsof -v

可查看版本信息。


3️⃣ lsof 输出结构

执行 lsof 会显示类似以下表格:

COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
bash     1234  root  cwd   DIR  8,1    4096     2   /
python   2345  user  txt   REG  8,1   12345  56789  /usr/bin/python3


4️⃣ 常用用法

4.1 查看系统所有打开文件

lsof

文件非常多,通常结合 grep 或分页工具 less 使用。


4.2 查看某个进程打开的文件

lsof -p <PID>
# 例:查看 PID 为 1234 的进程
lsof -p 1234


4.3 查看某个用户打开的文件

lsof -u <用户名>
# 例:查看 user 打开的文件
lsof -u user


4.4 查看某个文件被哪些进程占用

lsof /path/to/file
# 例:查看 /var/log/syslog 被哪些进程打开
lsof /var/log/syslog


4.5 查看某个端口被占用情况(网络连接)

# 查看 TCP 端口 80
lsof -i TCP:80

# 查看所有网络连接
lsof -i

输出中:


4.6 查看某个协议(TCP/UDP)占用情况

lsof -i TCP
lsof -i UDP

可加上 -nP 参数避免域名解析,提高速度:

lsof -i TCP -nP


4.7 查看被删除但仍被占用的文件

在 Linux 中,文件被删除后,如果有进程仍然打开该文件,占用空间不会释放:

lsof | grep deleted

常用于排查 磁盘空间不释放 问题。


4.8 按文件类型筛选

lsof -d <FD>
# 例:查看所有目录类型
lsof -d cwd


4.9 持续监控文件变化

结合 watch

watch -n 2 'lsof -p 1234'

每 2 秒刷新一次 PID 为 1234 的文件状态。


5️⃣ 实战案例

案例 1:查看端口被占用

lsof -i TCP:3306
# 查到 mysqld 占用端口 3306,可以用于排查数据库启动失败

案例 2:释放被占用的日志文件

lsof /var/log/nginx/access.log
# 找到 PID 后
kill -9 <PID>

注意:强制杀进程可能影响服务,需要谨慎操作。

案例 3:查找删除但占用的文件释放空间

lsof | grep deleted
# 找到占用文件的 PID
kill -HUP <PID>  # 通常通过发送 HUP 信号让进程释放文件句柄


6️⃣ 常用参数总结

参数作用
-p指定进程
-u指定用户
-i查看网络连接
-nP网络查看时不解析域名,显示端口号
-d文件描述符过滤
+D <目录>查看某个目录下被打开的文件
-t只显示 PID(方便结合 kill 使用)
-c按进程名过滤
-r每 N 秒刷新显示(监控)

7️⃣ 注意事项

  1. 需要 root 权限查看其他用户进程打开的文件,否则只能看到自己用户的文件
  2. 对大系统,直接 lsof 会产生大量输出,建议使用 grep 或参数过滤
  3. lsof 对 NFS 文件、删除文件、套接字等都能显示,非常适合排错

总结

lsof 是 Linux 系统中 排查文件占用、端口冲突、磁盘空间问题的利器,结合 grep、kill、watch 等命令可以快速定位问题。

退出移动版