lsof 命令详解#

lsof 命令是 Linux 系统中用于显示系统中打开文件的命令,是文件操作中常用的命令之一。本文将从入门到无敌,详细介绍 lsof 命令的使用方法和技巧。

入门阶段#

基本用法#

lsof 命令的基本语法:

lsof [选项]

功能:显示系统中打开的文件,包括普通文件、目录、设备文件、网络文件等。lsof 命令可以帮助你了解哪些进程正在使用哪些文件,对于系统管理和故障排查非常有用。

常用示例#

  1. 显示所有打开的文件

    sudo lsof
  2. 显示指定文件的打开情况

    lsof file.txt
  3. 显示指定目录的打开情况

    lsof +D /home
  4. 显示指定进程打开的文件

    lsof -p 1234

中级阶段#

常用选项#

选项说明
-a与其他选项结合使用,逻辑与
-c显示指定命令打开的文件
-d显示指定文件描述符的文件
-g显示指定进程组打开的文件
-i显示网络连接
-n不解析主机名
-P不解析端口名
-p显示指定进程 ID 打开的文件
-u显示指定用户打开的文件
+D递归显示指定目录及其子目录中打开的文件
+L显示链接数小于指定值的文件
--help显示帮助信息
--version显示版本信息

组合使用示例#

  1. 显示指定用户打开的文件

    lsof -u user
  2. 显示指定命令打开的文件

    lsof -c nginx
  3. 显示网络连接

    # 显示所有网络连接
    lsof -i
    
    # 显示 TCP 连接
    lsof -i tcp
    
    # 显示 UDP 连接
    lsof -i udp
  4. 显示指定端口的网络连接

    lsof -i :80
  5. 显示指定主机的网络连接

    lsof -i @192.168.1.1
  6. 组合使用选项

    # 显示用户 user 且命令为 nginx 打开的文件
    lsof -u user -c nginx
    
    # 显示用户 user 且进程 ID 为 1234 打开的文件
    lsof -u user -p 1234

高级阶段#

高级使用示例#

  1. 显示所有监听端口

    lsof -i -sTCP:LISTEN
  2. 显示所有已建立的连接

    lsof -i -sTCP:ESTABLISHED
  3. 显示指定协议和端口的连接

    # 显示 TCP 80 端口的连接
    lsof -i tcp:80
    
    # 显示 UDP 53 端口的连接
    lsof -i udp:53
  4. 显示指定进程的网络连接

    lsof -p 1234 -i
  5. 显示指定用户的网络连接

    lsof -u user -i
  6. 显示文件系统类型

    lsof -b
  7. 显示文件的详细信息

    lsof -l
  8. 显示文件的用户 ID

    lsof -n -u

大师阶段#

复杂组合命令#

  1. grep 命令结合使用

    # 查找使用特定文件的进程
    lsof | grep file.txt
    
    # 查找使用特定端口的进程
    lsof -i | grep 8080
  2. kill 命令结合使用

    # 终止使用特定文件的进程
    lsof -t file.txt | xargs kill -9
    
    # 终止使用特定端口的进程
    lsof -t -i :8080 | xargs kill -9
  3. sort 命令结合使用

    # 按进程 ID 排序显示
    lsof | sort -k 2
    
    # 按文件大小排序显示
    lsof +l | sort -k 7 -nr
  4. uniq 命令结合使用

    # 显示唯一的进程
    lsof | awk '{print $2}' | sort | uniq
    
    # 显示唯一的文件
    lsof | awk '{print $9}' | sort | uniq
  5. awk 命令结合使用

    # 统计每个进程打开的文件数
    lsof | awk '{print $2}' | sort | uniq -c | sort -nr
    
    # 统计每个用户打开的文件数
    lsof | awk '{print $3}' | sort | uniq -c | sort -nr
  6. find 命令结合使用

    # 查找并显示打开的文件
    find /home -name "*.txt" -type f | xargs lsof

与其他命令结合使用#

  1. netstat 命令结合使用

    # 显示网络连接
    lsof -i && netstat -tuln
  2. ps 命令结合使用

    # 显示进程信息和打开的文件
    ps aux | grep nginx && lsof -c nginx
  3. df 命令结合使用

    # 显示磁盘空间使用情况和打开的文件
    df -h && lsof | grep deleted
  4. du 命令结合使用

    # 显示目录大小和打开的文件
    du -sh /home && lsof +D /home
  5. 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 使别名生效。

高级技巧#

  1. 使用 lsof 命令查找被删除但仍被进程使用的文件

    # 查找被删除但仍被进程使用的文件
    lsof | grep deleted
    
    # 查找被删除但仍被进程使用的大文件
    lsof | grep deleted | awk '{if($7 > 1024*1024) print $0}'
  2. 使用 lsof 命令查找占用特定设备的进程

    # 查找占用 /dev/sda1 的进程
    lsof /dev/sda1
  3. 使用 lsof 命令查找内存映射文件

    # 查找内存映射文件
    lsof | grep mem
  4. 使用 lsof 命令监控文件访问

    # 监控文件访问
    while true; do
        lsof file.txt
        sleep 1
    done
  5. 使用 lsof 命令和 watch 命令结合使用

    # 实时监控网络连接
    watch -n 1 "lsof -i"
  6. 使用 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

性能优化#

  1. 使用 -n-P 选项提高速度

    # 推荐:不解析主机名和端口名
    lsof -nP -i
    
    # 不推荐:解析主机名和端口名
    lsof -i
  2. 使用 -c 选项限制命令范围

    # 推荐:只显示指定命令打开的文件
    lsof -c nginx
    
    # 不推荐:显示所有打开的文件
    lsof
  3. 使用 -u 选项限制用户范围

    # 推荐:只显示指定用户打开的文件
    lsof -u user
    
    # 不推荐:显示所有打开的文件
    lsof
  4. 使用 -p 选项限制进程范围

    # 推荐:只显示指定进程打开的文件
    lsof -p 1234
    
    # 不推荐:显示所有打开的文件
    lsof
  5. 使用 +D 选项限制目录范围

    # 推荐:只显示指定目录中打开的文件
    lsof +D /home
    
    # 不推荐:显示所有打开的文件
    lsof

总结#

lsof 命令是 Linux 系统中用于显示系统中打开文件的重要命令,掌握其各种选项和使用技巧,可以帮助你更好地了解系统的运行状态,对于系统管理和故障排查非常有用。从入门到无敌,本文涵盖了 lsof 命令的所有重要用法,希望对你有所帮助。

常用选项总结#

选项说明
-a与其他选项结合使用,逻辑与
-c显示指定命令打开的文件
-d显示指定文件描述符的文件
-g显示指定进程组打开的文件
-i显示网络连接
-n不解析主机名
-P不解析端口名
-p显示指定进程 ID 打开的文件
-u显示指定用户打开的文件
+D递归显示指定目录及其子目录中打开的文件
+L显示链接数小于指定值的文件

最佳实践#

  1. 使用 -n-P 选项:使用 -n-P 选项,不解析主机名和端口名,提高命令执行速度。

  2. 限制显示范围:使用 -c-u-p 等选项,限制显示范围,提高命令执行速度。

  3. 结合其他命令:与 grepkillsortuniq 等命令结合使用,实现更复杂的功能。

  4. 定期检查:定期使用 lsof 命令检查系统中打开的文件,特别是被删除但仍被进程使用的文件,避免磁盘空间被占用。

  5. 故障排查:在系统出现故障时,使用 lsof 命令查找问题原因,例如网络连接问题、文件访问问题等。

  6. 安全检查:使用 lsof 命令检查系统中是否有可疑的进程或网络连接,提高系统安全性。

通过不断练习和使用,你将能够熟练掌握 lsof 命令的各种技巧,成为 Linux 系统管理的高手。