lsof的用法
lsof全名list opened files,也就是列举系统中已经被打开的文件。linux环境中,任何事物都是文件,设备是文件,目录是文件,甚至sockets也是文件。所以,用好lsof命令,对日常的linux管理非常有帮助。
lsof是linux最常用的命令之一,通常的输出格式为:
#lsof +d /usr/local/
#lsof -i :22 知道22端口现在运行什么程序
等等
查看相应用法可以查看man帮助查找对应选项:man lsof
常见包括如下几个字段:
1、COMMAND默认以9个字符长度显示命令名称。可使用+c参数指定显示的宽度,若+c后跟的参数为零,则显示命令的全名(-c)
2、PID 进程的ID号(-p )
3、TID 如果是一个线程,显示线程 ID
4、USER 命令的执行UID或系统中登陆的用户名称。(-u)
5、FD 是文件描述符 File Descriptor number(-d)
6、TYPE 类型
7、DEVICE 使用character special、block special表示的设备号
8、SIZE/OFF 文件的大小,如果不能用大小表示的,会留空。
9、NODE 本地文件的inode id
10、挂载点和文件的全路径(链接会被解析为实际路径),或者连接双方的地址和端口、状态等
使用样例:
lsof urfile 显示这个文件(ufile)被哪个程序调用
lsof -c systemd 显示systemd 进程使用了哪些文件
lsof -p pid 使用 pid 显示进程使用了哪些文件
lsof -i:22 显示22端口被哪些ip使用
lsof +d /root 显示 root 下被打开的文件,不递归
lsof +D /root 同上,递归
lsof -u username 显示用户打开的文件
lsof的其他用法
1.使用lsof 还可以恢复之前删除的部分文件(内存中的进程还在)
详细操作请移步:https://blog.csdn.net/dutsoft/article/details/51248761
lsof恢复删除的内容的原理还是对删除后,依然存留在内存中的进程的恢复。这就需要追溯到linux的储存机制上了。对于许多应用程序,尤其是日志文件和数据库,这种恢复删除文件的方法非常有用。
Linux文件的存储机制和存储结构:
一个文件在文件系统中的存放分为两个部分:数据部分和指针部分,指针位于文件系统的meta-data中,数据被删除后,这个指针就从meta-data中清除了,而数据部分存储在磁盘中,数据对应的指针从meta-data中清除后,文件数据部分占用的空间就可以被覆盖并写入新的内容,之所以出现删除abc.txt文件后,空间还没释放,就是因为python进程还在一直向这个文件写入内容,导致虽然删除了abc.txt文件,但文件对应的指针部分由于进程锁定,并未从meta-data中清除,而由于指针并未被删除,那么系统内核就认为文件并未被删除,因此通过df命令查询空间并未释放。
在文件系统处理文件需要的信息都存放在索引节点(inode)中,如果在删除文件的时候索引节点的引用计数不为0(表示文件正在被使用),则不会在磁盘中真正的删除文件,从而保证正在使用此文件的进程能够正常的处理文件。
首先我们一起来看一下内核中关于文件系统的一些关键数据结构的关联,当一个进程打开一个文件后,便会在内核中创建一个file对象,这个对象主要描述了进程如何与文件进行交互。file对象中将指向一个dentry结构(目录项),目录项中描述了目录项名称,父目录项信息,子目录项信息等。而dentry中的d_inode所指向的inode节点中则包含了实际的文件存储在磁盘上的信息。
当多个进程打开同一个文件时,内核中变会创建相应的file对象,但是他们都公用同一个dentry,只不过每一次打开文件dentry的引用计数d_count加1。并且对于打开的同一个文件而言,inode也是唯一的,inode的引用计数i_count一般为文件硬链接的数目。
Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号。表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号码;其次,通过inode号码,获取inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据。
原文地址:http://blog.51cto.com/13873689/2150844