lsof 命令详解#
lsof 命令是 Linux 系统中用于显示系统中打开文件的命令,是文件操作中常用的命令之一。本文将从入门到无敌,详细介绍 lsof 命令的使用方法和技巧。
入门阶段#
基本用法#
lsof 命令的基本语法:
lsof [选项]功能:显示系统中打开的文件,包括普通文件、目录、设备文件、网络文件等。lsof 命令可以帮助你了解哪些进程正在使用哪些文件,对于系统管理和故障排查非常有用。
常用示例#
显示所有打开的文件:
sudo lsof显示指定文件的打开情况:
lsof file.txt显示指定目录的打开情况:
lsof +D /home显示指定进程打开的文件:
lsof -p 1234
中级阶段#
常用选项#
| 选项 | 说明 |
|---|---|
-a | 与其他选项结合使用,逻辑与 |
-c | 显示指定命令打开的文件 |
-d | 显示指定文件描述符的文件 |
-g | 显示指定进程组打开的文件 |
-i | 显示网络连接 |
-n | 不解析主机名 |
-P | 不解析端口名 |
-p | 显示指定进程 ID 打开的文件 |
-u | 显示指定用户打开的文件 |
+D | 递归显示指定目录及其子目录中打开的文件 |
+L | 显示链接数小于指定值的文件 |
--help | 显示帮助信息 |
--version | 显示版本信息 |
组合使用示例#
显示指定用户打开的文件:
lsof -u user显示指定命令打开的文件:
lsof -c nginx显示网络连接:
# 显示所有网络连接 lsof -i # 显示 TCP 连接 lsof -i tcp # 显示 UDP 连接 lsof -i udp显示指定端口的网络连接:
lsof -i :80显示指定主机的网络连接:
lsof -i @192.168.1.1组合使用选项:
# 显示用户 user 且命令为 nginx 打开的文件 lsof -u user -c nginx # 显示用户 user 且进程 ID 为 1234 打开的文件 lsof -u user -p 1234
高级阶段#
高级使用示例#
显示所有监听端口:
lsof -i -sTCP:LISTEN显示所有已建立的连接:
lsof -i -sTCP:ESTABLISHED显示指定协议和端口的连接:
# 显示 TCP 80 端口的连接 lsof -i tcp:80 # 显示 UDP 53 端口的连接 lsof -i udp:53显示指定进程的网络连接:
lsof -p 1234 -i显示指定用户的网络连接:
lsof -u user -i显示文件系统类型:
lsof -b显示文件的详细信息:
lsof -l显示文件的用户 ID:
lsof -n -u
大师阶段#
复杂组合命令#
与
grep命令结合使用:# 查找使用特定文件的进程 lsof | grep file.txt # 查找使用特定端口的进程 lsof -i | grep 8080与
kill命令结合使用:# 终止使用特定文件的进程 lsof -t file.txt | xargs kill -9 # 终止使用特定端口的进程 lsof -t -i :8080 | xargs kill -9与
sort命令结合使用:# 按进程 ID 排序显示 lsof | sort -k 2 # 按文件大小排序显示 lsof +l | sort -k 7 -nr与
uniq命令结合使用:# 显示唯一的进程 lsof | awk '{print $2}' | sort | uniq # 显示唯一的文件 lsof | awk '{print $9}' | sort | uniq与
awk命令结合使用:# 统计每个进程打开的文件数 lsof | awk '{print $2}' | sort | uniq -c | sort -nr # 统计每个用户打开的文件数 lsof | awk '{print $3}' | sort | uniq -c | sort -nr与
find命令结合使用:# 查找并显示打开的文件 find /home -name "*.txt" -type f | xargs lsof
与其他命令结合使用#
与
netstat命令结合使用:# 显示网络连接 lsof -i && netstat -tuln与
ps命令结合使用:# 显示进程信息和打开的文件 ps aux | grep nginx && lsof -c nginx与
df命令结合使用:# 显示磁盘空间使用情况和打开的文件 df -h && lsof | grep deleted与
du命令结合使用:# 显示目录大小和打开的文件 du -sh /home && lsof +D /home与
top命令结合使用:# 显示系统状态和打开的文件 top -b -n 1 && lsof | head -n 20
无敌阶段#
自定义 lsof 命令别名#
为了提高工作效率,可以在 .bashrc 或 .bash_profile 文件中为 lsof 命令创建别名:
# 在 ~/.bashrc 文件中添加以下内容
alias lsof='sudo lsof' # 默认使用 sudo
alias lsofi='lsof -i' # 显示网络连接
alias lsofP='lsof -P' # 不解析端口名
alias lsofn='lsof -n' # 不解析主机名
alias lsofnp='lsof -nP' # 不解析主机名和端口名
alias lsof80='lsof -i :80' # 显示 80 端口的连接
alias lsof443='lsof -i :443' # 显示 443 端口的连接
alias lsoffile='lsof +D' # 递归显示目录中打开的文件
alias lsofuser='lsof -u' # 显示指定用户打开的文件
alias lsofcmd='lsof -c' # 显示指定命令打开的文件
alias lsofproc='lsof -p' # 显示指定进程打开的文件添加后,执行 source ~/.bashrc 使别名生效。
高级技巧#
使用
lsof命令查找被删除但仍被进程使用的文件:# 查找被删除但仍被进程使用的文件 lsof | grep deleted # 查找被删除但仍被进程使用的大文件 lsof | grep deleted | awk '{if($7 > 1024*1024) print $0}'使用
lsof命令查找占用特定设备的进程:# 查找占用 /dev/sda1 的进程 lsof /dev/sda1使用
lsof命令查找内存映射文件:# 查找内存映射文件 lsof | grep mem使用
lsof命令监控文件访问:# 监控文件访问 while true; do lsof file.txt sleep 1 done使用
lsof命令和watch命令结合使用:# 实时监控网络连接 watch -n 1 "lsof -i"使用
lsof命令和bash脚本结合使用:# 创建脚本监控文件访问 cat > file_monitor.sh << 'EOF' #!/bin/bash file="$1" if [ -z "$file" ]; then echo "用法:$0 <文件路径>" exit 1 fi echo "监控文件:$file" echo "按 Ctrl+C 退出" while true; do echo "\n[ $(date) ] 访问该文件的进程:" lsof "$file" sleep 5 done EOF chmod +x file_monitor.sh ./file_monitor.sh file.txt
性能优化#
使用
-n和-P选项提高速度:# 推荐:不解析主机名和端口名 lsof -nP -i # 不推荐:解析主机名和端口名 lsof -i使用
-c选项限制命令范围:# 推荐:只显示指定命令打开的文件 lsof -c nginx # 不推荐:显示所有打开的文件 lsof使用
-u选项限制用户范围:# 推荐:只显示指定用户打开的文件 lsof -u user # 不推荐:显示所有打开的文件 lsof使用
-p选项限制进程范围:# 推荐:只显示指定进程打开的文件 lsof -p 1234 # 不推荐:显示所有打开的文件 lsof使用
+D选项限制目录范围:# 推荐:只显示指定目录中打开的文件 lsof +D /home # 不推荐:显示所有打开的文件 lsof
总结#
lsof 命令是 Linux 系统中用于显示系统中打开文件的重要命令,掌握其各种选项和使用技巧,可以帮助你更好地了解系统的运行状态,对于系统管理和故障排查非常有用。从入门到无敌,本文涵盖了 lsof 命令的所有重要用法,希望对你有所帮助。
常用选项总结#
| 选项 | 说明 |
|---|---|
-a | 与其他选项结合使用,逻辑与 |
-c | 显示指定命令打开的文件 |
-d | 显示指定文件描述符的文件 |
-g | 显示指定进程组打开的文件 |
-i | 显示网络连接 |
-n | 不解析主机名 |
-P | 不解析端口名 |
-p | 显示指定进程 ID 打开的文件 |
-u | 显示指定用户打开的文件 |
+D | 递归显示指定目录及其子目录中打开的文件 |
+L | 显示链接数小于指定值的文件 |
最佳实践#
使用
-n和-P选项:使用-n和-P选项,不解析主机名和端口名,提高命令执行速度。限制显示范围:使用
-c、-u、-p等选项,限制显示范围,提高命令执行速度。结合其他命令:与
grep、kill、sort、uniq等命令结合使用,实现更复杂的功能。定期检查:定期使用
lsof命令检查系统中打开的文件,特别是被删除但仍被进程使用的文件,避免磁盘空间被占用。故障排查:在系统出现故障时,使用
lsof命令查找问题原因,例如网络连接问题、文件访问问题等。安全检查:使用
lsof命令检查系统中是否有可疑的进程或网络连接,提高系统安全性。
通过不断练习和使用,你将能够熟练掌握 lsof 命令的各种技巧,成为 Linux 系统管理的高手。