lsof 意思是‘List Open Files’它可以列出各种进程打开的文件的信息,centos6.4中默认是不带lsof这个命令的.要想使用它首先的通过yum -y install lsof 安装。
lsof 默认不带任何参数,将输出所有进程打开的所有文件.当然这个不是我们所需要的
1.lsof 文件名|设备名: 查看文件、设备被哪些进程使用
lsof /usr/local/tomcat/conf/server.xml
2.出某个目录下被打开的文件
lsof +D /var/log
3.指定进程号查看该进程打开的文件
lsof -p 1612
4.查看指定用户所打开的所有进程跟文件
lsof -u root
5.查看指定端口有哪些进程在使用
lsof -i:22
6.例出所有的tcp、udp连接
lsof -i tcp
lsof -i upd
7.查看指定网口有哪些进程在使用
lsof [email protected]
8.查看指定程序打开的文件
lsof -c java
9.lsof 组合逻辑查询
-a 与
-o 或
^ 非
lsof -a -u mysql -c java
lsof -o -u mysql -c java
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才能被写入新的内容。