从入门到精通:lsof命令详解
\*\*概述\*\* \`lsof\`(List Open Files)是一款在类Unix操作系统(如Linux、BSD和macOS)中使用的强大命令行工具。它用于列出当前系统上所有打开的文件。由于在类Unix系统中,几乎所有东西都被当作文件来处理,\`lsof\`不仅可以显示常规文件,还可以显示网络套接字、管道、设备文件等。 lsof 查看的打开文件可以是 1. 普通文件 2. 目录 3. 字符或块设备文件 4. 共享库 5. 管道、命名管道 6. 符号链接 7. 网络文件(如 NFS file、网络 socket,Unix 域名 socket) 8. 其它类型的文件,等等 ## \*\*lsof的基本用法\*\* 运行\`lsof\`命令会列出所有当前系统上打开的文件。由于这通常会生成大量输出,因此需要使用一些选项来过滤和查找特定的信息。 ### 列出特定文件的打开情况 \`\`\` lsof /path/to/file \`\`\` !\[图片\](/usr/uploads/my-upload/2024/09/866dc1bffb6662b45da3.png) ### 查找使用特定端口的进程 \`\`\` lsof -i :8080 \`\`\` !\[图片\](/usr/uploads/my-upload/2024/09/c933211802c60e7f9a34.png) ### 查找特定用户打开的文件 \`\`\` lsof -u lighthouse \`\`\` !\[图片\](/usr/uploads/my-upload/2024/09/3dc26cc50e19c9b79eee.png) ### 查找特定进程ID (PID) 打开的文件 \`\`\` lsof -p 1234 \`\`\` !\[图片\](/usr/uploads/my-upload/2024/09/a45ca71d9d3a5ffc9b9a.png) ### 查找网络连接 \`\`\` lsof -i \`\`\` !\[图片\](/usr/uploads/my-upload/2024/09/3a214d409cf4c2c96760.png) ### 查找特定类型的文件 \`\`\` lsof -a -d DIR \`\`\` ## \*\*高级用法\*\* ### 组合选项 \`lsof\`允许组合多个选项来精确定位所需的信息。例如,查找用户root打开的所有网络连接: \`\`\` lsof -a -u root -i \`\`\` !\[图片\](/usr/uploads/my-upload/2024/09/887bb62b95cdaa69c8b1.png) ### 输出格式 \`lsof\`的输出包含多个字段,例如: - \*\*COMMAND\*\*: 打开文件的命令名称 - \*\*PID\*\*: 进程ID - \*\*USER\*\*: 用户名 - \*\*FD\*\*: 文件描述符 - \*\*TYPE\*\*: 文件类型(如REG、DIR、CHR、FIFO、SOCK等) - \*\*DEVICE\*\*: 设备号 - \*\*SIZE/OFF\*\*: 文件大小或文件偏移 - \*\*NODE\*\*: 文件节点号 - \*\*NAME\*\*: 文件名或路径 可以使用管道和其他命令(如grep、awk)进一步处理\`lsof\`的输出。 ## \*\*实用示例\*\* ### 查找并杀死占用端口的进程 假设端口8080被占用,可以使用以下命令查找并杀死占用该端口的进程: \`\`\` lsof -i :8080 \`\`\` !\[图片\](/usr/uploads/my-upload/2024/09/13516f0513da15880a60.png) 获取进程ID后,使用\`kill\`命令: \`\`\` kill -9 # 31035 \`\`\` ### 查找所有挂载的文件系统上的打开文件 要查找所有挂载的文件系统上的打开文件,可以使用+D选项: \`\`\` lsof +D /data \`\`\` !\[图片\](/usr/uploads/my-upload/2024/09/a738c48d6fd0ec356db3.png)