lsof命令用过啥?是干嘛的?

1 个回答

  • 张苏
    看透不说透,是规矩,也是格局。
    ## **Linux `lsof` 命令使用指南** `lsof`(List Open Files)用于查看当前系统中被进程打开的文件,包括普通文件、目录、套接字、管道等。在 Linux/Unix 中,一切皆文件,因此 `lsof` 可以用于调试文件占用、网络连接状态等。 ### **1. `lsof` 基本用法** 显示所有被进程打开的文件,默认输出包含: - COMMAND(进程名称) - PID(进程 ID) - USER(用户) - FD(文件描述符) - TYPE(文件类型) - DEVICE(设备号) - SIZE/OFF(文件大小) - NODE(索引节点号) - NAME(文件名) 示例: ``` lsof | head -10 ``` 查看前 10 行数据,避免输出太多内容。 ### **2. 查看特定进程的打开文件** #### **指定进程 ID(PID)** ```bash lsof -p 1234 # 查看 PID 1234 进程打开的文件 ``` 多个进程: ```bash lsof -p 1234,5678 ``` #### **指定进程名称** ```bash lsof -c java # 查看所有 Java 进程打开的文件 ``` 模糊匹配: ```bash lsof -c "java*" ``` #### **查看所有 Java 进程打开的文件** ```bash lsof -p $(pgrep -d, -f java) ``` ### **3. 统计进程打开的文件数** ```bash lsof -p 1234 | wc -l # 统计 PID 1234 打开的文件数 ``` 或者: ```bash ls -l /proc/1234/fd/ | wc -l ``` ### **4. 查找某个文件被哪个进程占用** ```bash lsof /var/log/syslog # 查看哪个进程正在使用 /var/log/syslog ``` ```bash lsof /path/to/file ``` 如果尝试删除文件但显示 "Device or resource busy",可用此命令检查哪个进程在占用它。 ### **5. 查看网络连接** #### **显示所有网络连接** ```bash lsof -i ``` #### **过滤 TCP/UDP 连接** ```bash lsof -i tcp lsof -i udp ``` #### **按端口号过滤** ```bash lsof -i :8080 # 查看占用 8080 端口的进程 ``` ```bash lsof -i tcp:3306 # 查看占用 MySQL 端口 3306 的进程 ``` #### **按 IP 地址过滤** ```bash lsof -i @192.168.1.100 ``` #### **查看某个进程的网络连接** ```bash lsof -i -p 1234 ``` ### **6. 过滤特定用户** ```bash lsof -u root # 查看 root 用户打开的文件 ``` 多个用户: ```bash lsof -u root,nginx ``` 排除用户: ```bash lsof -u ^nginx # 排除 nginx 进程 ``` ### **7. 查找删除但仍被占用的文件** ```bash lsof | grep deleted ``` 如果删除了一个文件但进程仍在占用,文件空间不会释放。可以尝试: ```bash kill -9 PID # 终止进程释放文件 ``` 或释放日志文件: ```bash echo "" > /proc/PID/fd/FD_NUMBER ``` ### **8. 监控文件使用情况** #### **实时监控某个文件** ```bash watch -n 1 lsof /path/to/file ``` #### **实时监控 80 端口** ```bash watch -n 1 lsof -i :80 ``` ### **9. 查找进程打开的 `.jar` 文件** ```bash lsof -p 1234 | grep jar ``` 如果 Java 进程打开的 `.jar` 文件过多,可能会导致文件句柄不足。 ### **10. 其他常用选项** - `-n`:不解析 IP 地址,提高查询速度 - `-P`:不解析端口号,直接显示数字 - `-r`:实时刷新,类似 `watch` - `+D`:递归查询某个目录下所有打开的文件 示例: ```bash lsof -nP -i :22 # 快速查找占用 22 端口的进程 ``` ```bash lsof +D /var/log # 查看 /var/log 目录下被占用的文件 ``` ### **总结** | 任务 | 命令 | |------|------| | 查看所有打开的文件 | `lsof` | | 查看某进程的打开文件 | `lsof -p PID` | | 查看某个文件被哪个进程占用 | `lsof /path/to/file` | | 查看某个端口被哪个进程占用 | `lsof -i :8080` | | 查看删除但仍被占用的文件 | `lsof | grep deleted` | | 统计进程打开的文件数 | `lsof -p PID | wc -l` | | 监控某个文件的打开状态 | `watch -n 1 lsof /path/to/file` | `lsof` 是排查文件占用、网络端口占用、句柄泄漏等问题的强大工具,结合 `grep`、`wc -l` 等命令可以更高效地分析系统资源使用情况。
    发布于 2025-02-12 05:52 •IP属地 西藏
    举报
    评论
    收藏