lsof 意思是‘List Open Files’它可以列出各种进程打开的文件的信息,centos6.4中默认是不带lsof这个命令的.要想使用它首先的通过yum -y install lsof 安装。

lsof__强大的系统监控、诊断命令_lsof  磁盘满  df  du

lsof 默认不带任何参数,将输出所有进程打开的所有文件.当然这个不是我们所需要的


1.lsof  文件名|设备名:    查看文件、设备被哪些进程使用

   lsof /usr/local/tomcat/conf/server.xml

   lsof__强大的系统监控、诊断命令_lsof  磁盘满  df  du_02


2.出某个目录下被打开的文件

  lsof +D /var/log

 lsof__强大的系统监控、诊断命令_lsof  磁盘满  df  du_03


3.指定进程号查看该进程打开的文件

  lsof -p 1612

lsof__强大的系统监控、诊断命令_lsof  磁盘满  df  du_04


4.查看指定用户所打开的所有进程跟文件

   lsof -u root

  lsof__强大的系统监控、诊断命令_lsof  磁盘满  df  du_05


5.查看指定端口有哪些进程在使用

  lsof -i:22

 lsof__强大的系统监控、诊断命令_lsof  磁盘满  df  du_06


6.例出所有的tcp、udp连接

  lsof -i tcp

  lsof -i upd

lsof__强大的系统监控、诊断命令_lsof  磁盘满  df  du_07


7.查看指定网口有哪些进程在使用

   lsof -i@192.168.1.207

   lsof__强大的系统监控、诊断命令_lsof  磁盘满  df  du_08


8.查看指定程序打开的文件

  lsof -c java

  lsof__强大的系统监控、诊断命令_lsof  磁盘满  df  du_09


9.lsof 组合逻辑查询

  -a 与

  -o 或

  ^ 非

  lsof -a -u mysql -c java

  lsof__强大的系统监控、诊断命令_lsof  磁盘满  df  du_10

 lsof -o -u mysql -c java

  lsof__强大的系统监控、诊断命令_lsof  磁盘满  df  du_11

 lsof -u ^root



10.生产环境中用lsof解决问题的一则案例

   朋友前段时间跟我说他有台服务器/dev/sda1挂载的那个目录满了,然后他清了一批日志之类的东西,过了不久又满了。他用df -h查看确实使用率为100%,容量50G使用50G ,而当他用du -sh  /dev/sda1的时候,使用才20多G,但是确实是写不进去文件了..

  让他用lsof -n | grep deleted 看一下,该命令会把所有未释放文件句柄的进程例出来.朋友一查,mongodb 日志占了20多G.重启mongodb进程,把日志配置到磁盘容量大的目录,然后做日志滚动问题解决。


  为什么df命令跟du命令会出有如此大的差异呢?这就跟他们的实现原理有关系了.

    du 命令根据指定文件系统中的所有目录、符号连接、和文件使用的块数累加得到文件系统使用容量的总和,文件系统记录自身的数据如i节点、磁盘分布图、超级块等等这些数据du命令是不统计的。du命令是用户级程序,只能获取文件系统的部分情况.

    df命令则是通过磁盘分布图得出的总块数和使用块数,获得的是真正的文件系统数据.linux下面文件只是一个指向inode的链接,inode链接包含了文件的所有属性,如权限和所有者等,当我们删除一个文件,实际上只是删除了指向inode的链接,并没有删除inode的内容,前面引用的进程还可以引用,只有当链接完全移除,这些inode才能被写入新的内容。