lsof命令解析

lsof是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息。因此通过lsof工具能够查看这个列表对系统监测以及排错。

输出信息含义

在终端下输入lsof即可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。

[root@queen ~]# lsof /root/
COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
aliyun-se   757 root  cwd    DIR  253,1     4096 131073 /root
bash      17433 root  cwd    DIR  253,1     4096 131073 /root
lsof      17460 root  cwd    DIR  253,1     4096 131073 /root
lsof      17461 root  cwd    DIR  253,1     4096 131073 /root

每行显示一个打开的文件,若不指定条件默认将显示所有进程打开的所有文件。

lsof输出各列信息的意义如下:

COMMAND:进程的名称 PID:进程标识符

USER:进程所有者

FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等 TYPE:文件类型,如DIR、REG等

DEVICE:指定磁盘的名称

SIZE:文件的大小

NODE:索引节点(文件在磁盘上的标识)

NAME:打开文件的确切名称

lsof常用选项含义

lsof filename #显示打开指定文件的所有进程
lsof -c 进程 -c 进程 #显示指定进程名现在打开的文件,可以同时列出多个程序的
lsof -p pid1,pid2... #查看指定进程号的进程打开了哪些文件
lsof -i  #列出所有的网络连接
lsof -i[:service|port]  #列出谁在使用某个特定的tcp/udp端口
    service --> /etc/service中的 service name (可以不只一个)
    port --> 端口号 (可以不只一个)

lsof使用示例

恢复删除的文件

(1.1)如果在系统中有某个进程打开了一个文件,但是这个文件被我们误删除,此时我们希望将误删除的文件恢复。如果某个被误删除的文件所对应的进程没有关,这个文件就可以恢复。
(1.2)在Linux中的FD文件描述符与windows中的文件句柄是同样的一个概念,一个进程打开一个文件就会产生相应的文件描述符,如果这个进程将文件关闭了,那么这个文件描述符或文件句柄就会跟着释放掉了。
(1.3)在生产环境常见的问题就是,有维护人员或者开发同事使用tail命令实时查看日志。然后另外的人使用rm命令删除,这会导致磁盘空间不会真正的释放,因为你要删除的文件,还有进程在使用,文件句柄没有释放,即tail

什么是文件
  • 文件实际上是一个指向inode的链接, inode链接包含了文件的所有属性, 比如权限和所有者, 数据块地址(文件存储在磁盘的这些数据块中). 当你删除(rm)一个文件, 实际删除了指向inode的链接, 并没有删除inode的内容. 进程可能还在使用. 只有当inode的所有链接完全移去, 然后这些数据块将可以写入新的数据.
  • proc文件系统可以协助我们恢复数据. 每一个系统上的进程在/proc都有一个目录和自己的名字, 里面包含了一个fd(文件描述符)子目录(进程需要打开文件的所有链接). 如果从文件系统中删除一个文件, 此处还有一个inode的引用:
/proc/进程号/fd/文件描述符

你需要知道打开文件的进程号(pid)和文件描述符(fd). 这些都可以通过lsof工具方便获得

使用lsof命令排查
  • 如果知道文件名,那就可以直接使用如下命令lsof |grep file
  • 但是如果不知道是哪个文件,或者是很多文件都有这样的情况,需要使用如下命令
lsof |grep deleted
  • 使用kill 命令来释放文件句柄从而释放空间
    假设我们不小心删掉了/var/log/messages
 [root@queen home]# lsof | grep deleted
rsyslogd    759          root    4w      REG              253,1    268564     264140 /var/log/messages (deleted)
in:imjour   759   781    root    4w      REG              253,1    268564     264140 /var/log/messages (deleted)
rs:main     759   782    root    4w      REG              253,1    268564     264140 /var/log/messages (deleted)
## 4是句柄号
[root@queen home]# ls -l  /proc/759/fd/4
l-wx------ 1 root root 64 Oct 10 15:56 /proc/759/fd/4 -> /var/log/messages (deleted)
[root@queen home]# cp /proc/759/fd/4 /var/log/message
[root@queen home]# ls -l /var/log/message
-rw------- 1 root root 268564 Mar  5 14:16 /var/log/message
发布了10 篇原创文章 · 获赞 0 · 访问量 959

猜你喜欢

转载自blog.csdn.net/weixin_43572702/article/details/104631391