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
    模拟测试环境脚本

     


  • 相关阅读:
    centos7.6 使用yum安装mysql5.7
    解决hadoop本地库问题
    docker-compose 启动警告
    docker 安装zabbix5.0 界面乱码问题解决
    docker 部署zabbix问题
    zookeeper 超时问题
    hbase regionserver异常宕机
    (转载)hadoop 滚动升级
    hadoop Requested data length 86483783 is longer than maximum configured RPC length
    zkfc 异常退出问题,报错Received stat error from Zookeeper. code:CONNECTIONLOSS
  • 原文地址:https://www.cnblogs.com/Caiyundo/p/10401345.html
Copyright © 2011-2022 走看看