场景一:文件系统使用率很高,但是找不到具体哪个文件占用了空间

原因:在unix系统中,如果有两个进程同时使用一个文件,如果其中一个进程删除了这个文件,但是这个文件此刻不会正真被释放,一直要等待引用它的所有进程都释放后才会正真被删除,那么如果别的进程一直在向这个文件写数据,就会造成文件系统很大,但是用普通命令找不到

测试:

  1. Testlsof.sh
  2. #!/bin/sh
  3.  
  4. cnt=1
  5. while (( cnt < 1000 ))
  6. do
  7. echo " TEST lsof command "
  8. sleep 1
  9. cnt=`expr $cnt + 1`
  10. done
  11.  
  12. 在一个窗口运行Testlsof.sh
  13. [root@limt ~]# sh Testlsof.sh > testlsof.log
  14. 打开另外一个窗口
  15. [root@limt ~]# rm -rf testlsof.log
  16. 这个时候ls会发现testlsof.log不存在了
  17. 然后查看Testlsof.sh进程号
  18. [root@limt ~]# ps -ef|grep Testlsof.sh
  19. root 10996 10269 0 10:06 pts/3 00:00:00 sh Testlsof.sh
  20. root 11269 10162 0 10:07 pts/2 00:00:00 grep Testlsof
  21. 使用lsof命令可以看到testlsof.log仍被 Testlsof.sh进程打开,但是后面有个delete的字样
  22. [root@limt ~]# lsof -p 10996
  23. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  24. sh 10996 root cwd DIR 253,1 4096 524289 /root
  25. sh 10996 root rtd DIR 253,1 4096 2 /
  26. sh 10996 root txt REG 253,1 938768 475247 /bin/bash
  27. sh 10996 root mem REG 253,1 156872 975392 /lib64/ld-2.12.so
  28. sh 10996 root mem REG 253,1 22536 975399 /lib64/libdl-2.12.so
  29. sh 10996 root mem REG 253,1 1922152 975393 /lib64/libc-2.12.so
  30. sh 10996 root mem REG 253,1 138280 975059 /lib64/libtinfo.so.5.7
  31. sh 10996 root mem REG 253,10 69952 394158 /usr/lib64/gconv/libGB.so
  32. sh 10996 root mem REG 253,10 16976 393954 /usr/lib64/gconv/EUC-CN.so
  33. sh 10996 root mem REG 253,10 99154480 524306 /usr/lib/locale/locale-archive
  34. sh 10996 root mem REG 253,10 26060 394165 /usr/lib64/gconv/gconv-modules.cache
  35. sh 10996 root 0u CHR 136,3 0t0 6 /dev/pts/3
  36. sh 10996 root 1w REG 253,1 2160 526093 /root/testlsof.log (deleted) //此处便是占用空间的文件
  37. sh 10996 root 2u CHR 136,3 0t0 6 /dev/pts/3
  38. sh 10996 root 255r REG 253,1 105 526097 /root/Testlsof.sh

对于场景一我们可以如下找出仍占用文件系统的文件:

lsof不带参数为默认列出所有进程打开的文件

  1. [root@limt ~]# lsof|grep delete
  2. sh 10996 root 1w REG 253,1 2720 526093 /root/testlsof.log (deleted)
  3. 然后根据进程号找出进程名
  4. [root@limt ~]# ps -ef|grep 10996
  5. root 10996 10269 0 10:06 pts/3 00:00:00 sh Testlsof.sh

场景二:别人打开了一个应用进程,没有记录应用日志输出到那,通过lsof命令找打日志输出位置

如下:

模拟他人打开一个应用,并输出日志

  1. root@limt ~]# nohup sh Testlsof.sh > 111.log &
  2. [1] 14170
  3. [root@limt ~]# nohup: 忽略输入重定向错误到标准输出端
  4.  
  5. 获得进程名字,查看此进程打开的文件
  6. [root@limt ~]# ps -ef|grep Testlsof
  7. root 14170 13132 0 10:21 pts/5 00:00:00 sh Testlsof.sh
  8. root 14183 13132 0 10:21 pts/5 00:00:00 grep Testlsof
  9. [root@limt ~]# lsof -p 14170
  10. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  11. sh 14170 root cwd DIR 253,1 4096 524289 /root
  12. sh 14170 root rtd DIR 253,1 4096 2 /
  13. sh 14170 root txt REG 253,1 938768 475247 /bin/bash
  14. sh 14170 root mem REG 253,1 156872 975392 /lib64/ld-2.12.so
  15. sh 14170 root mem REG 253,1 22536 975399 /lib64/libdl-2.12.so
  16. sh 14170 root mem REG 253,1 1922152 975393 /lib64/libc-2.12.so
  17. sh 14170 root mem REG 253,1 138280 975059 /lib64/libtinfo.so.5.7
  18. sh 14170 root mem REG 253,10 69952 394158 /usr/lib64/gconv/libGB.so
  19. sh 14170 root mem REG 253,10 16976 393954 /usr/lib64/gconv/EUC-CN.so
  20. sh 14170 root mem REG 253,10 99154480 524306 /usr/lib/locale/locale-archive
  21. sh 14170 root mem REG 253,10 26060 394165 /usr/lib64/gconv/gconv-modules.cache
  22. sh 14170 root 0w CHR 1,3 0t0 3842 /dev/null
  23. sh 14170 root 1w REG 253,1 280 526102 /root/111.log //此处便是日志输出文件(0,1,2是进程默认打开的文件描述符)
  24. sh 14170 root 2w REG 253,1 280 526102 /root/111.log //这里我们是把1,2的文件描述符重定向到111.log
  25. sh 14170 root 255r REG 253,1 105 526097 /root/Testlsof.sh

场景三:查看某个端口是被那个进程打开

  1. </pre><pre code_snippet_id="557768" snippet_file_name="blog_20141221_3_2022099" name="code" class="python">[root@limt ~]# lsof -i:22
  2. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  3. sshd 2589 root 3u IPv4 16268 0t0 TCP *:ssh (LISTEN)
  4. sshd 2589 root 4u IPv6 16270 0t0 TCP *:ssh (LISTEN)
  5. sshd 2665 root 3u IPv4 16523 0t0 TCP 192.168.1.104:ssh->limt:59580 (ESTABLISHED)
  6. sshd 10157 root 3u IPv4 75435 0t0 TCP 192.168.1.104:ssh->limt:49212 (ESTABLISHED)
  7. sshd 13110 root 3u IPv4 94454 0t0 TCP 192.168.1.105:ssh->limt:49285 (ESTABLISHED)
  8.  
  9. 可以看到2589进程在IPv4和IPv6打开了22进程端口

场景四:在卸载一个文件系统时候报device is busy

  1. [root@limt ~]# umount /yunwei/
  2. umount: /yunwei: device is busy.
  3. (In some cases useful info about processes that use
  4. the device is found by lsof(8) or fuser(1))
  5. [root@limt ~]# lsof /yunwei/
  6. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  7. bash 13132 root cwd DIR 253,5 4096 2 /yunwei
  8.  
  9. [root@limt ~]# ps -ef|grep 13132
  10. root 13132 13110 0 10:15 pts/5 00:00:00 -bash
  11. root 17262 15204 0 10:42 pts/6 00:00:00 grep 13132
  12. [root@limt ~]#
  13. [root@limt ~]# kill -9 13132
  14. [root@limt ~]# umount /yunwei/

五,利用/proc文件查看进程打开文件



可以看到有个more程序打开了111.log文件

  1. [root@limt ~]# ps -ef|grep more
  2. root 17369 17330 0 10:44 pts/0 00:00:00 more 111.log
  3. root 17390 15204 0 10:45 pts/6 00:00:00 grep more
  4. [root@limt ~]# cd /proc/17369
  5. [root@limt 17369]# pwd
  6. /proc/17369
  7. [root@limt 17369]# ls
  8. attr clear_refs cwd fdinfo maps mountstats oom_score root smaps status
  9. autogroup cmdline environ io mem net oom_score_adj sched stack syscall
  10. auxv coredump_filter exe limits mountinfo numa_maps pagemap schedstat stat task
  11. cgroup cpuset fd loginuid mounts oom_adj personality sessionid statm wchan
  12. [root@limt 17369]# cd fd
  13. [root@limt fd]# ls -lrt
  14. 总用量 0
  15. lrwx------. 1 root root 64 12 19 10:45 2 -> /dev/pts/0
  16. lr-x------. 1 root root 64 12 19 10:46 3 -> /root/111.log
  17. lrwx------. 1 root root 64 12 19 10:46 1 -> /dev/pts/0
  18. lrwx------. 1 root root 64 12 19 10:46 0 -> /dev/pts/0
  19. 可以看到文件描述符3就是/root/111.log

六,/proc文件系统与lsof命令

  1. [root@limt fd]# ps -ef|grep ssh
  2. root 2589 1 0 07:40 ? 00:00:00 /usr/sbin/sshd
  3. root 13110 2589 0 10:15 ? 00:00:00 sshd: root@pts/0,pts/6
  4. root 17491 15204 0 10:47 pts/6 00:00:00 grep ssh
  5. [root@limt fd]# cd /proc/2589
  6. [root@limt 2589]# cd fd
  7. [root@limt fd]# ls
  8. 0 1 2 3 4
  9. [root@limt fd]# ls -lrt
  10. 总用量 0
  11. lrwx------. 1 root root 64 12 19 10:29 4 -> socket:[16270] //打开了两个socket
  12. lrwx------. 1 root root 64 12 19 10:29 3 -> socket:[16268]
  13. lrwx------. 1 root root 64 12 19 10:29 2 -> /dev/null
  14. lrwx------. 1 root root 64 12 19 10:29 1 -> /dev/null
  15. lrwx------. 1 root root 64 12 19 10:29 0 -> /dev/null
  16. [root@limt fd]#
  17. [root@limt fd]# netstat -an|grep 22
  18. tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN
  19. tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
  20. tcp 0 52 192.168.1.105:22 192.168.1.103:49285 ESTABLISHED
  21. tcp 0 0 :::22 :::* LISTEN
  22.  
  23. [root@limt fd]#
  24. [root@limt fd]# lsof -p 2589
  25. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  26. sshd 2589 root cwd DIR 253,1 4096 2 /
  27. sshd 2589 root rtd DIR 253,1 4096 2 /
  28. sshd 2589 root txt REG 253,10 526008 581654 /usr/sbin/sshd
  29. sshd 2589 root mem REG 253,1 65928 974878 /lib64/libnss_files-2.12.so
  30. sshd 2589 root mem REG 253,1 243096 975421 /lib64/libnspr4.so
  31. sshd 2589 root mem REG 253,1 17096 975423 /lib64/libplds4.so
  32. sshd 2589 root mem REG 253,1 21256 975422 /lib64/libplc4.so
  33. sshd 2589 root mem REG 253,10 177952 439737 /usr/lib64/libnssutil3.so
  34. sshd 2589 root mem REG 253,1 145720 975396 /lib64/libpthread-2.12.so
  35. sshd 2589 root mem REG 253,1 12592 975408 /lib64/libkeyutils.so.1.3
  36. sshd 2589 root mem REG 253,1 46368 975410 /lib64/libkrb5support.so.0.1
  37. sshd 2589 root mem REG 253,1 386040 975419 /lib64/libfreebl3.so
  38. sshd 2589 root mem REG 253,1 1922152 975393 /lib64/libc-2.12.so
  39. sshd 2589 root mem REG 253,10 1286744 451926 /usr/lib64/libnss3.so
  40. sshd 2589 root mem REG 253,1 17256 975412 /lib64/libcom_err.so.2.1
  41. sshd 2589 root mem REG 253,1 177520 975411 /lib64/libk5crypto.so.3.1
  42. sshd 2589 root mem REG 253,1 944712 975413 /lib64/libkrb5.so.3.3
  43. sshd 2589 root mem REG 253,1 280520 975414 /lib64/libgssapi_krb5.so.2.2
  44. sshd 2589 root mem REG 253,1 113952 975403 /lib64/libresolv-2.12.so
  45. sshd 2589 root mem REG 253,1 43392 975420 /lib64/libcrypt-2.12.so
  46. sshd 2589 root mem REG 253,1 116368 974900 /lib64/libnsl-2.12.so
  47. sshd 2589 root mem REG 253,1 91096 975398 /lib64/libz.so.1.2.3
  48. sshd 2589 root mem REG 253,1 17520 975404 /lib64/libutil-2.12.so
  49. sshd 2589 root mem REG 253,10 1665328 436731 /usr/lib64/libcrypto.so.1.0.0
  50. sshd 2589 root mem REG 253,1 124624 975409 /lib64/libselinux.so.1
  51. sshd 2589 root mem REG 253,1 22536 975399 /lib64/libdl-2.12.so
  52. sshd 2589 root mem REG 253,1 58480 975442 /lib64/libpam.so.0.82.2
  53. sshd 2589 root mem REG 253,1 115536 975434 /lib64/libaudit.so.1.0.0
  54. sshd 2589 root mem REG 253,1 43256 975444 /lib64/libwrap.so.0.7.6
  55. sshd 2589 root mem REG 253,1 12688 975098 /lib64/libfipscheck.so.1.1.0
  56. sshd 2589 root mem REG 253,1 156872 975392 /lib64/ld-2.12.so
  57. sshd 2589 root 0u CHR 1,3 0t0 3842 /dev/null
  58. sshd 2589 root 1u CHR 1,3 0t0 3842 /dev/null
  59. sshd 2589 root 2u CHR 1,3 0t0 3842 /dev/null
  60. sshd 2589 root 3u IPv4 16268 0t0 TCP *:ssh (LISTEN)
  61. sshd 2589 root 4u IPv6 16270 0t0 TCP *:ssh (LISTEN)
  62.  
  63. 可以看到lsof显示的两个TCP文件的DEVICE与/proc一致(1626816270

lsof在运维中的应用的更多相关文章

  1. linux运维中的命令梳理(一)

    在linux日常运维中,我们平时会用到很多常规的操作命令. 下面对常用命令进行梳理: 命令行日常系快捷键(不分大小写)CTRL + A 移动光标到行首CTRL + E 移动光标到行末CTRL + U ...

  2. autohotkey在运维中的应用

         AutoHotkey是一个自由.开源的宏生成器和自动化软件工具,它让用户能够自动执行重复性任务.AutoHotkey可以修改任何应用程序的用户界面(例如,把默认的Windows按键控制命令替 ...

  3. DBA避坑宝典:Oracle运维中的那些事儿

    对于Oracle运维中的那些事儿,我的最终目的:不是比谁更惨,而是能够从中吸取经验和教训. 从我的理解来看,我会从下面的几个方面来进行说明DBA运维中的一些事儿. 每个部分都是非常关键的,缺一不可,而 ...

  4. 漫谈ELK在大数据运维中的应用

    漫谈ELK在大数据运维中的应用 圈子里关于大数据.云计算相关文章和讨论是越来越多,愈演愈烈.行业内企业也争前恐后,群雄逐鹿.而在大数据时代的运维挑站问题也就日渐突出,任重而道远了.众所周知,大数据平台 ...

  5. 安全运维中基线检查的自动化之ansible工具巧用

    i春秋作家:yanzm 原文来自:安全运维中基线检查的自动化之ansible工具巧用 前几周斗哥分享了基线检查获取数据的脚本,但是在面对上百台的服务器,每台服务器上都跑一遍脚本那工作量可想而知,而且都 ...

  6. HDFS datanode心跳与运维中的实际案例

    分布式系统的节点之间常采用心跳来维护节点的健康状态,如yarn的rm与nm之间,hdfs的nn与dn之间.DataNode会定期(dfs.heartbeat.interval配置项配置,默认是3秒)向 ...

  7. linux运维中的命令梳理(二)

    回想起来,从事linux运维工作已近5年之久了,日常工作中会用到很多常规命令,之前简单罗列了一些命令:http://www.cnblogs.com/kevingrace/p/5985486.html今 ...

  8. 浅谈运维中的安全问题-FTP篇

    写这一系列文章的动因很简单,在年前最后一个项目的时候在客户现场做了的几个安全加固.由于时间问题,很多东西就拿来主义没经过思考直接更改了,并未细细品味其中的原理和方法,所以特地搭建实验环境,分析下其中的 ...

  9. 运维中的日志切割操作梳理(Logrotate/python/shell脚本实现)

    对于Linux系统安全来说,日志文件是极其重要的工具.不知为何,我发现很多运维同学的服务器上都运行着一些诸如每天切分Nginx日志之类的CRON脚本,大家似乎遗忘了Logrotate,争相发明自己的轮 ...

随机推荐

  1. 【翻译七】java-同步

    Synchronization Threads communicate primarily by sharing access to fields and the objects reference ...

  2. 【JAVA多线程概述】

    一.多线程概述 一个进程中至少有一个线程,每一个线程都有自己运行的内容,这个内容可以称为线程要执行的任务. 不能没一个问题都使用多线程,能使用单线程解决的问题就不要使用多线程解决. 使用多线程的弊端: ...

  3. Linux环境下使用perl编写CGI(httpd)

    例子1: /var/www/cgi-bin/hello.cgi #!/usr/bin/perl print "Content-type: text/html\n\n"; print ...

  4. 如何安装sublime text2以及它的插件?

    下载Sublime Text2的安装包,安装,安装后打开的界面如图   下面我们来给他安装插件,首先安装packagecontrol,打开菜单栏中的View-->show console   在 ...

  5. EF Core 1.0中使用Include的小技巧

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:由于EF Core暂时不支持Lazy Loading,所以利用Include来加载额外 ...

  6. iOS和Android的app界面设计规范(转)

    记录一下iOS和Andoird的界面设计规范,方便进行标准的产品设计,并与设计师顺畅沟通 iOS篇 界面尺寸 设备 分辨率 状态栏高度 导航栏高度 标签栏高度 iPhone6 plus 1242×22 ...

  7. Build an ETL Pipeline With Kafka Connect via JDBC Connectors

    This article is an in-depth tutorial for using Kafka to move data from PostgreSQL to Hadoop HDFS via ...

  8. 【微信Java开发 --1---番外1】在windows下,使用JAVA执行多条DOS命令+文件夹/路径中有空格怎么解决【目的是实现内容穿透外网】

    内网穿透外网的那一篇,参正集1 但是每次都要Ctrl+R 启动DOS窗口,也就是CMD,一句一句的去粘,略显繁琐. 所以将这些任务写在JAVA程序中,启动一次程序就可以实现[内网穿透]的功能,多好啊! ...

  9. 程序员必备的代码审查(Code Review)清单【转载】

    在我们关于高效代码审查的博文中,我们建议使用一个检查清单.在代码审查中,检查清单是一个非常好的工具——它们保证了审查可以在你的团队中始终如一的进行.它们也是一种保证常见问题能够被发现并被解决的便利方式 ...

  10. Swift3.0语言教程获取字符

    Swift3.0语言教程获取字符 Swift3.0语言教程获取字符,在字符串中获取某一下标位置(下标索引)处的字符是很常见的功能,在NSString中使用character(at:)方法实现,其语法形 ...