zoukankan      html  css  js  c++  java
  • 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
    模拟测试环境脚本

     


  • 相关阅读:
    转载: RAID详解[RAID0/RAID1/RAID10/RAID5]
    用户交互式命令:read
    linux下fdisk分区管理、文件系统管理、挂载文件系统等
    linux文件系统下的特殊权限
    find命令详解
    python3中 getpass模块使用
    个人shell积累
    手把手教你利用爬虫爬网页(Python代码)
    数通HCIP-ospf知识点
    HCIE之路--超全ospf思维导图
  • 原文地址:https://www.cnblogs.com/Caiyundo/p/10401345.html
Copyright © 2011-2022 走看看