【工具】lsof 的使用

(list open files) 是一个列出当前系统打开文件的工具!

原理:

在linux环境下,任何事物都以文件的形式存在,系统在后台都为应用程序分配了一个对应的文件描述符,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因此通过lsof工具能够查看应用程序打开文件的描述符列表,以便查看应用程序的信息!

用法以及含义:

losf 的语法:

lsof [options] filename

如果不使用参数的话,默认显示所有进程打开的所有文件。

[root@rac3 ~]# lsof | more

COMMAND     PID      USER   FD      TYPE             DEVICE       SIZE       NODE NAME

init          1      root  cwd       DIR                8,3       4096          2 /

init          1      root  rtd       DIR                8,3       4096          2 /

init          1      root  txt       REG                8,3      43496    2450664 /sbin/init

init          1      root  mem       REG                8,3      95464    1764613 /lib64/libselinux.so.1

init          1      root   10u     FIFO               0,17                  1204 /dev/initctl

migration     2      root  cwd       DIR                8,3       4096          2 /

migration     2      root  rtd       DIR                8,3       4096          2 /

migration     2      root  txt   unknown                                          /proc/2/exe

rpc.statd  2567      root    0u      CHR                1,3                  1432 /dev/null

sdpd       2643      root    2u      CHR                1,3                  1432 /dev/null

oracle    10970    oracle   17u     IPv6              21324                       UDP rac3:30005

sdpd       2643      root    4u     sock                0,5                  7350 can t identify protocol

sdpd       2643      root    5u     unix 0xffff81012e52e380                  7358 /var/run/sdp

rpc.statd  2567      root    4w     FIFO                0,6                  7128 pipe

rpc.statd  2567      root    5u     unix 0xffff81013f84cb80                  7131 socket

rpc.statd  2567      root    7u     IPv4               7218                   TCP *:3com-amp3 (LISTEN)

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

COMMAND:进程的名称!

PID:    进程标识符!

USER:   进程所有者!

FD:     文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等!

TYPE:   文件类型,如DIR、REG,MEM等!

DEVICE: 指定磁盘的名称!

SIZE:   文件的大小!

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

NAME:   打开的文件名称 !

FD 列中的文件描述符意义:

cwd  表示应用程序的当前工作目录,也是该应用程序启动的目录,除非它本身对这个目录进行更改。

txt  表示该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的/sbin/init程序。

数值 表示应用程序的文件描述符,打开该文件时返回的整数。如上的最后一行文件/dev/initctl,其文件描述符为 10;/dev/null的描述符为2!

u    表示该文件被打开并处于读取/写入模式,而不是只读(r)或只写(w)模式。大写的W表示该应用程序具有对整个文件的写锁。该文件描述符用于确保每次只能打开一个应用程序实例!

初始打开每个应用程序时,都具有三个文件描述符,从0到2,分别表示标准输入、输出和错误流。所以大多数应用程序所打开的文件的FD都是从3开始。

Type 列中的文件描述符意义:

REG  表示文件

DIR  表示目录

CHR  表示字符设备

BLK  表示和块设备

UNIX 表示UNIX 域套接字

FIFO 表示先进先出(FIFO)队列

IPv4 表示网际协议(IP)套接字。

了解了lsof的原理,那losf到底有什么用呢?下面介绍losf的用处

1 查看端口的使用 比如1521,查看有多少机器建立了与当前机器oracle数据库的连接! 

oracle@rac3:/home/oracle>lsof -i :1521 | more

COMMAND   PID   USER   FD   TYPE  DEVICE SIZE NODE NAME

oracle    329 oracle   13u  IPv4 6167257       TCP dba-host1.hz.ali.com:1521->10.250.3.44:44782 (ESTABLISHED)

oracle    331 oracle   15u  IPv4 6167274       TCP dba-host1.hz.ali.com:1521->10.250.3.56:45332 (ESTABLISHED)

oracle    515 oracle   15u  IPv4 6167700       TCP dba-host1.hz.ali.com:1521->10.250.3.47:43180 (ESTABLISHED)

oracle   1436 oracle   15u  IPv4 6169854       TCP dba-host1.hz.ali.com:1521->10.249.196.131:39527 (ESTABLISHED)

oracle   1468 oracle   15u  IPv4 6169968       TCP dba-host1.hz.ali.com:1521->10.250.3.34:52021 (ESTABLISHED)

oracle   1470 oracle   15u  IPv4 6169977       TCP dba-host1.hz.ali.com:1521->10.250.3.34:52022 (ESTABLISHED)

查看mysql的3306  rac3-->rac4 是一个主从架构

[root@rac3 ~]# lsof -i :3306 

COMMAND  PID  USER   FD   TYPE DEVICE SIZE NODE NAME

mysqld  3181 mysql   12u  IPv6   8063       TCP *:mysql (LISTEN)

mysqld  3181 mysql   39u  IPv6   8070       TCP rac3:mysql->rac4:36554 (ESTABLISHED)

2 查看某个用户打开的类型mem的文件:

[root@rac3 ~]#  lsof -a -u oracle -d mem | more

COMMAND   PID   USER  FD   TYPE DEVICE     SIZE    NODE NAME

bash     9625 oracle mem    REG    8,3   139416 1764595 /lib64/ld-2.5.so

bash     9625 oracle mem    REG    8,3  1713160 1764596 /lib64/libc-2.5.so

bash     9625 oracle mem    REG    8,3    23360 1764602 /lib64/libdl-2.5.so

bash     9625 oracle mem    REG    8,3    15584 1764624 /lib64/libtermcap.so.2.0.8

bash     9625 oracle mem    REG    8,3    53880 1764315 /lib64/libnss_files-2.5.so

bash     9625 oracle mem    REG    8,3 56462864 4447583 /usr/lib/locale/locale-archive

bash     9625 oracle mem    REG    8,3    25464 4541667 /usr/lib64/gconv/gconv-modules.cache

oracle  10970 oracle mem    REG   0,20 16777216   21166 /dev/shm/ora_yangdb_98305_0

oracle  10970 oracle mem    REG   0,20        0   21167 /dev/shm/ora_yangdb_98305_1

oracle  10970 oracle mem    REG   0,20        0   21168 /dev/shm/ora_yangdb_98305_2

oracle  10970 oracle mem    REG   0,20        0   21169 /dev/shm/ora_yangdb_98305_3

...省略...

3 查看那些程序在使用某个文件:

[root@rac3 ~]# lsof /opt/mysql/data/

COMMAND  PID  USER   FD   TYPE DEVICE SIZE    NODE NAME

mysqld  3181 mysql  cwd    DIR    8,3 4096 2842467 /opt/mysql/data/

4 恢复误删除的文件:

os 原理:

    当进程打开了某个文件时,只要该进程保持打开该文件,即使将其删除,它依然存在于磁盘中。这意味着,进程并不知道文件已经被删除,它仍然可以向打开该文件时提供给它的文件描述符进行读取和写入。除了该进程之外,这个文件是不可见的,因为已经删除了其相应的目录索引节点。

    在/proc 目录下,其中包含了反映内核和进程树的各种文件。/proc目录挂载的是在内存中所映射的一块区域,所以这些文件和目录并不存在于磁盘中,因此当我们对这些文件进行读取和写入时,实际上是在从内存中获取相关信息。

    大多数与lsof相关的信息都存储于以进程的PID命名的目录中,即/proc/123中包含的是 PID为123的进程的信息。

这里引用一个kamus的文章《Linux/Unix恢复误删除的文件恢复》,此文比较详细的介绍了具体的恢复步骤,同时也告诉我们对于数据库的操作一定要谨慎小心!

时间: 2024-09-26 22:27:22

【工具】lsof 的使用的相关文章

Linux命令必知必会

[TOC] top命令 监控系统的运行状态,并且可以按照cpu.内存.执行时间进行排序. 第一行中,03:30:22是当前时间,up 39 min是系统运行的运行了多长时间,1 user指出了当前有几个用户登录到系统,load average指的是系统负载,这后面的三个值分别是1分钟,5分钟,15分钟的系统负载平均值. 如果仅仅需要第一行中的信息,可以使用uptime命令. 第二行中,Task指出了当前系统有多少个进程,以及各种状态的进程统计信息. 第三行是%Cpu(s),代表了CPU占用比例,

Linux Shell常用技巧(九)

十九.  和系统运行进程相关的Shell命令:       1.  进程监控命令(ps):    要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程,而ps命令就是最基本同时也是非常强大的进程查看命令.使用该命令可以确定有哪些进程正在运行和运行的状态.进程是否结束.进程有没有僵死.哪些进程占用了过多的资源等等.总之大部分信息都是可以通过执行该命令得到的.    ps命令存在很多的命令行选项和参数,然而我们最为常用只有两种形式,这里先给出与它们相关的选项和参数的含义: 选

实用的系统工具之 lsof

lsof 简介 只需输入 lsof 就可以生成大量的信息,因为 lsof 需要访问核心内存和各种 文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能. lsof 的示例输出: root@YLinux:~/lab 0# lsof COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd 1 root cwd DIR 8,6 4096 2 / systemd 1 root rtd DIR 8,6 4096 2 / s

Linux系统及应用问题分析排查工具

Linux服务器上经常遇到一些系统和应用上的问题,如何分析排查,需要利器,下面总结列表了一些常用工具.trace tool:最后也列举了最近hadoop社区在开发发展的分布式系统的trace tool. 概览: 引用linux-performance-analysis-and-tools中图片,说明这些tool试用层次位置 OS系统命令 系统信息(RHEL/Fedora) uname -a 或 cat /proc/version #print system information Linux h

Linux系统被入侵后使用lsof命令恢复被删除日志的方法

  Linux系统是服务器最常见的操作系统,当然也面临着非常多的安全事件,相较Windows操作系统,Linux采用了明确的访问权限控制和全面的管理工具,具有非常高的安全性和稳定性.Linux系统被入侵后,攻击者为了掩盖踪迹,经常会清除系统中的各种日志,包括Web的access和error日志.last日志.message日志.secure日志等,给我们后期应急响应和取证分析带来了非常大的阻力.所以,恢复被清除的日志是非常重要的取证和分析环节,一下是使用lsof命令恢复日志文件的案例,适用于常见

Linux下利用Lsof恢复误删文件的方法

  原理:在Linux系统的/proc 分区下保存着进程的目录和名字,包含fd(文件描述符)和其下的子目录(进程打开文件的链接),那么如果删除了一个文件,还存在一个 inode的引用:/proc/进程号/fd/文件描述符.我们只要知道当前打开文件的进程pid和文件描述符fd就能利用lsof工具列出进程打开的文件. 一.将 ls 的手册过滤掉主要控制符后重定向到文件ls.txt 中,并用more查看,CTRL + Z 暂停查看操作 1: [root@localhost script]# man l

在Linux上如何使用fuser工具来查询文件的用户

在Linux中,fuser工具可用来查询文件的用户,除此之外,fuser还有很多用途,能够搭配参数使用,下面小编将针对fuser工具的使用方式给大家做个详细介绍,希望对你有所帮助. lsof也具备类似的功能,它也能够找出正在对指定文件访问的进程,两者的区别是fuser在于它可以一次杀死那些正在访问指定文件的进程. fuser常用的场合是: fuser可用于查询文件.目录.socket端口和文件系统的使用进程,并且可以使用fuser关闭进程. 当文件系统umount报device busy时,常用

Linux工具快速上手,Linux很实用命令

Linux工具快速上手   前言 Linux下有很多命令行工具供我们使用,每个工具总是提供了大量参数供我们选择: 实际工作中,我们用到的工具,最常用的总是那么几个参数组合: 为此,我写了这本书相对实用的书: 这本书专注于Linux工具的最常用用法,以便读者能以最快时间掌握,并在工作中应用: 说明 全书分为三个部分: 第一部分为基础篇,介绍我们工作中常用的工具的高频用法: 第二部分为进阶篇,介绍的工具更多的适合程序员使用,分为程序构建.程序调试及程序优化: 第三部分是工具参考篇,主要介绍实用工具的

8个Linux命令行性能监测工具

对每个系统/网络管理员来说,每天监测Linux系统性能是一项非常艰巨的任务.在IT业从事5年的Linux系统管理员后,我发现监控和保持系统正常运行真不是件容易的事,为此,我总结了8个非常实用的命令行工具给Linux/Unix系统管理员.这些命令支持所有的Linux系统,不仅可以用于监控系统,还可以发现导致性能问题的原因所在.下面提供的8个命令足够你选择其中一个用于你的场景中. 1.TOP--Linux进程监控 Linux的top命令是一个性能监视程序,许多Linux系统管理员经常使用它来监测系统