lsof之列出已打开的文件

lsof命令常用解析

    Linux中常用 lsof 来查看文件调用进程等相关信息,也可用来查看活跃的进程信息和端口监听进程信息等

1. lsof 命令介绍

NAME
    lsof - list open files
    
用法
    lsof [options] [filename]

常用选项
    -c    显示指定进程现在正在打开的文件
    -p    显示指定进程号现在正在打开的文件
    -g    显示指定gid号进程正在打开的文件
    -u    显示指定用户名启动的进程打开的文件
    +d    显示指定目录下被进程打开的文件(不包含子目录)
    +D    显示指定目录下被进程打开的文件(包含子目录)
    -d    显示指定fd文件描述符的进程
    -i    [46][proto][@host|addr][:svc_list|port_list]按以上条件获取进程信息
          [ipv4|ipv6][tcp|udp][@hostname|ipaddr][/etc/services定义的服务|服务端口port]
    -U : 获取UNIX套接口地址
    -t : 仅获取进程ID
    -l : 在输出显示用户ID而不是用户名

2. lsof 常见用法

    # 显示系统活跃进程打开的文件
    lsof
    
    # 显示调用/var/log/messages文件的进程
    lsof /var/log/messages
    
    # 显示crond进程打开的文件
    lsof -c crond
    
    # 显示进程号为1328的进程打开的文件
    lsof -p 1328
    
    # 显示gid号为1的进程打开的文件
    lsof -g 1
    
    # 显示用户root启用的进程打开的文件
    lsof -u root
    
    # 显示/var/log目录下被进程打开的文件
    lsof +d /var/log/        #(不包含子目录)
    lsof +D /var/log/        #(包含子目录)
    
    # 显示文件描述符fd为4的进程打开的文件
    lsof -d 4
    
    # 通过[46][proto][@host|addr][:svc_list|port_list]条件匹配进程信息输出
    lsof -i tcp:22
    

3. lsof使用实例

  生产实例:Web服务器磁盘满故障深入解析

模拟测试环境:
    # 安装httpd
    yum install httpd -y
    
    # 修改配置文件使日志内容指向/app/logs/access_log
    sed -i '/CustomLog logs/access_log common/ aCustomLog /app/logs/access_log common' /etc/httpd/conf/httpd.conf
    
    # 模拟磁盘/dev/sdc,注入80K的空间
    dd if=/dev/zero of=/dev/sdc bs=8K count=10
    # 格式化模拟磁盘
    mkfs.ext4 /dev/sdc
    y
    
    # 创建日志目录并将/dev/sdc挂载上去
    mkdir -p /app/logs
    mount -o loop /dev/sdc /app/logs
    df -h
    
    # 重启httpd服务使其重新加载配置文件
    /etc/init.d/httpd restart
    
    # 循环语句访问httpd服务使其日志空间写满
    for n in `seq 10000`;do curl 127.0.0.1 &>/dev/null;done
    
    # 查看磁盘使用情况(/dev/sdc使用率达99%即可)
    df -h    
    
    # 删除日志文件/app/logs/access_log
    rm -f /app/logs/access_log
    df -h    # 发现磁盘使用率没有降下来
    lsof |grep /app/logs        # 发现虽然文件已经被删除了,但是httpd进程仍旧在调用/app/logs/access_log文件,系统空间未释放
    
    
    
    解决思路:删除日志文件磁盘空间没有降下来的原因是因为系统中httpd进程仍旧在调用access_log文件
              根据原理,我们可以考虑清空/app/logs/access_log文件里的内容以解决该问题
              若已经删除了/app/logs/access_log文件,则可以通过重启httpd服务以释放磁盘空间
              
    解决方法1:清空被进程调用的文件内容
        命令:>/app/logs/access_log && df -h
    
    解决方法2:删除/app/logs/access_log,并重启httpd服务
        命令:rm -f /app/logs/access_log && /etc/init.d/httpd restart && df -h
yum install httpd -y 
&& sed -i '/CustomLog logs/access_log common/ aCustomLog /app/logs/access_log common' /etc/httpd/conf/httpd.conf 
&& dd if=/dev/zero of=/dev/sdc bs=8K count=10 
&& mkfs.ext4 /dev/sdc
y

mkdir -p /app/logs 
&& mount -o loop /dev/sdc /app/logs 
&& df -h 
&& /etc/init.d/httpd restart 
&& for n in `seq 10000`;do curl 127.0.0.1 &>/dev/null;done 
&& df -h 
&& rm -f /app/logs/access_log 
&& df -h 
&& lsof |grep /app/logs
模拟测试环境脚本

 


原文地址:https://www.cnblogs.com/Caiyundo/p/10401345.html