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