转载: linux lsof详解alibaba - 威尼斯人

转载: linux lsof详解alibaba

2019-02-09 09:24:55 | 作者: 夏真 | 标签: 文件,进程,运用 | 浏览: 8184

source of the document:

lsof简介

lsof(list open files)是一个列出当时体系翻开文件的东西。在linux环境下,任何事物都以文件的方式存在,经过文件不仅仅能够拜访惯例数据,还能够拜访网络连接和硬件。所以如传输操控协议 (TCP) 和用户数据报协议 (UDP) 套接字等,体系在后台都为该运用程序分配了一个文件描述符,不管这个文件的实质怎么,该文件描述符为运用程序与根底操作体系之间的交互供给了通用接口。因为运用程序翻开文件的描述符列表供给了很多关于这个运用程序自身的信息,因而经过lsof东西能够检查这个列表对体系监测以及排错将是很有协助的。

lsof运用



lsof输出信息含义

在终端下输入lsof即可显现体系翻开的文件,因为 lsof 需求拜访中心内存和各种文件,所以有必要以 root 用户的身份运转它才能够充分地发挥其功用。

COMMAND  PID  USER  FD  TYPE  DEVICE  SIZE  NODE  NAME
init  1  root  cwd  DIR  3,3  1024  2  /
init  1  root  rtd  DIR  3,3  1024  2  /
init  1  root  txt  REG  3,3  38432  1763452  /sbin/init
init  1  root  mem  REG  3,3  106114  1091620  /lib/libdl-2.6.so
init  1  root  mem  REG  3,3  7560696  1091614  /lib/libc-2.6.so
init  1  root  mem  REG  3,3  79460  1091669  /lib/libselinux.so.1
init  1  root  mem  REG  3,3  223280  1091668  /lib/libsepol.so.1
init  1  root  mem  REG  3,3  564136  1091607  /lib/ld-2.6.so
init  1  root  10u  FIFO  0,15  1309  /dev/initctl

每行显现一个翻开的文件,若不指定条件默许将显现一切进程翻开的一切文件。lsof输出各列信息的含义如下:

COMMAND:进程的称号
PID:进程标识符
USER:进程一切者
FD:文件描述符,运用程序经过文件描述符辨认该文件。如cwd、txt等
TYPE:文件类型,如DIR、REG等
DEVICE:指定磁盘的称号
SIZE:文件的巨细
NODE:索引节点(文件在磁盘上的标识)
NAME:翻开文件的切当称号

其间FD 列中的文件描述符cwd 值表明运用程序的当时工作目录,这是该运用程序发动的目录,除非它自身对这个目录进行更改。

txt 类型的文件是程序代码,如运用程序二进制文件自身或同享库,如上列表中显现的 /sbin/init 程序。其次数值表明运用

程序的文件描述符,这是翻开该文件时回来的一个整数。如上的最终一行文件/dev/initctl,其文件描述符为 10。u 表明该

文件被翻开并处于读取/写入形式,而不是只读 ® 或只写 (w) 形式。一起还有大写 的W 表明该运用程序具有对整个文件的写

锁。该文件描述符用于保证每次只能翻开一个运用程序实例。初始翻开每个运用程序时,都具有三个文件描述符,从 0 到 2,

别离表明规范输入、输出和过错流。所以大多数运用程序所翻开的文件的 FD 都是从 3 开端。

与 FD 列比较,Type 列则比较直观。文件和目录别离称为 REG 和 DIR。而CHR 和 BLK,别离表明字符和块设备;

或许 UNIX、FIFO 和 IPv4,别离表明 UNIX 域套接字、先进先出 (FIFO) 行列和网际协议 (IP) 套接字。

lsof常用参数

lsof 常见的用法是查找运用程序翻开的文件的称号和数目。可用于查找出某个特定运用程序将日志数据记录到何处,或许正在盯梢某个问题。

例如,linux约束了进程能够翻开文件的数目。一般这个数值很大,所以不会发生问题,而且在需求时,运用程序能够恳求更大的值(直到某

个上限)。假设你置疑运用程序耗尽了文件描述符,那么能够运用 lsof 计算翻开的文件数目,以进行验证。lsof语法格局是:

lsof [options] filename

常用的参数列表:

lsof  filename 显现翻开指定文件的一切进程
lsof -a 表明两个参数都有必要满意时才显现成果
lsof -c string  显现COMMAND列中包括指定字符的进程一切翻开的文件
lsof -u username  显现所属user进程翻开的文件
lsof -g gid 显现归属gid的进程状况
lsof +d /DIR/ 显现目录下被进程翻开的文件
lsof +D /DIR/ 同上,可是会查找目录下的一切目录,时刻相对较长
lsof -d FD 显现指定文件描述符的进程
lsof -n 不将IP转换为hostname,缺省是不加上-n参数
lsof -i 用以显现契合条件的进程状况
lsof -i[46] [protocol][@hostname|hostaddr][:service|port]
  46 IPv4 or IPv6
  protocol TCP or UDP
  hostname Internet host name
  hostaddr IPv4地址
  service /etc/service中的 service name (能够不只一个)
  port 端口号 (能够不只一个)

例如: 检查22端口现在运转的状况

# lsof -i :22
COMMAND  PID USER  FD  TYPE DEVICE SIZE NODE NAME
sshd  1409 root  3u  IPv6  5678  TCP *:ssh (LISTEN)

检查所属root用户进程所翻开的文件类型为txt的文件:

# lsof -a -u root -d txt
COMMAND  PID USER  FD  TYPE DEVICE  SIZE  NODE NAME
init  1  root txt  REG  3,3  38432 1763452 /sbin/init
mingetty  1632 root txt  REG  3,3  14366 1763337 /sbin/mingetty
mingetty  1633 root txt  REG  3,3  14366 1763337 /sbin/mingetty
mingetty  1634 root txt  REG  3,3  14366 1763337 /sbin/mingetty
mingetty  1635 root txt  REG  3,3  14366 1763337 /sbin/mingetty
mingetty  1636 root txt  REG  3,3  14366 1763337 /sbin/mingetty
mingetty  1637 root txt  REG  3,3  14366 1763337 /sbin/mingetty
kdm  1638 root txt  REG  3,3  132548 1428194 /usr/bin/kdm
X  1670 root txt  REG  3,3 1716396 1428336 /usr/bin/Xorg
kdm  1671 root txt  REG  3,3  132548 1428194 /usr/bin/kdm
startkde  2427 root txt  REG  3,3  645408 1544195 /bin/bash
... ... 

lsof运用实例



一、查找谁在运用文件体系

在卸载文件体系时,假设该文件体系中有任何翻开的文件,操作一般将会失利。那么经过lsof能够找出那些进程在运用当时要卸载的文件体系,如下:

# lsof  /GTES11/
COMMAND  PID USER  FD  TYPE DEVICE SIZE NODE NAME
bash  4208 root  cwd  DIR  3,1 4096  2 /GTES11/
vim  4230 root  cwd  DIR  3,1 4096  2 /GTES11/

在这个示例中,用户root正在其/GTES11目录中进行一些操作。一个 bash是实例正在运转,而且它当时的目录为/GTES11,另一个则显现的是vim正在修改/GTES11下的文件。要成功地卸载/GTES11,应该在告诉用户以保证状况正常之后,间断这些进程。 这个示例说明晰运用程序的当时工作目录十分重要,因为它仍坚持着文件资源,而且能够防止文件体系被卸载。这就是为什么大部分看护进程(后台进程)将它们的目录更改为根目录、或效劳特定的目录(如 sendmail 示例中的 /var/spool/mqueue)的原因,以防止该看护进程阻挠卸载不相关的文件体系。

二、康复删去的文件

当Linux计算机遭到侵略时,常见的状况是日志文件被删去,以掩盖攻击者的踪影。办理过错也或许导致意外删去重要的文件,比如在整理旧日志时,意外地删去了数据库的活动业务日志。有时能够经过lsof来康复这些文件。

当进程翻开了某个文件时,只需该进程坚持翻开该文件,即便将其删去,它依然存在于磁盘中。这意味着,进程并不知道文件现已被删去,它依然能够向翻开该文件时供给给它的文件描述符进行读取和写入。除了该进程之外,这个文件是不行见的,因为现已删去了其相应的目录索引节点。

在/proc 目录下,其间包括了反映内核和进程树的各种文件。/proc目录挂载的是在内存中所映射的一块区域,所以这些文件和目录并不存在于磁盘中,因而当咱们对这些文件进行读取和写入时,实际上是在从内存中获取相关信息。大多数与 lsof 相关的信息都存储于以进程的 PID 命名的目录中,即 /proc/1234 中包括的是 PID 为 1234 的进程的信息。每个进程目录中存在着各种文件,它们能够使得运用程序简略地了解进程的内存空间、文件描述符列表、指向磁盘上的文件的符号链接和其他体系信息。lsof 程序运用该信息和其他关于内核内部状况的信息来发生其输出。所以lsof 能够显现进程的文件描述符和相关的文件名等信息。也就是咱们经过拜访进程的文件描述符能够找到该文件的相关信息。

 

当体系中的某个文件被意外地删去了,只需这个时分体系中还有进程正在拜访该文件,那么咱们就能够经过lsof从/proc目录下康复该文件的内容。 假设因为误操作将/var/log/messages文件删去掉了,那么这时要将/var/log/messages文件康复的办法如下:

首要运用lsof来检查当时是否有进程翻开/var/logmessages文件,如下:

# lsof |grep /var/log/messages
syslogd  1283  root  2w  REG  3,3  5381017  1773647 /var/log/messages (deleted)

从上面的信息能够看到 PID 1283(syslogd)翻开文件的文件描述符为 2。一起还能够看到/var/log/messages现已符号被删去了。因而咱们能够在 /proc/1283/fd/2 (fd下的每个以数字命名的文件表明进程对应的文件描述符)中检查相应的信息,如下:

# head -n 10 /proc/1283/fd/2
Aug  4 13:50:15 holmes86 syslogd 1.4.1: restart.
Aug  4 13:50:15 holmes86 kernel: klogd 1.4.1, log source = /proc/kmsg started.
Aug  4 13:50:15 holmes86 kernel: Linux version 2.6.22.1-8 (root@everestbuilder.linux-ren.org) (gcc version 4.2.0) #1 SMP Wed Jul 18 11:18:32 EDT 2007
Aug  4 13:50:15 holmes86 kernel: BIOS-provided physical RAM map:
Aug  4 13:50:15 holmes86 kernel:  BIOS-e820: 0000000000000000 - 000000000009f000 (usable)
Aug  4 13:50:15 holmes86 kernel:  BIOS-e820: 000000000009f000 - 00000000000a0000 (reserved)
Aug  4 13:50:15 holmes86 kernel:  BIOS-e820: 0000000000100000 - 000000001f7d3800 (usable)
Aug  4 13:50:15 holmes86 kernel:  BIOS-e820: 000000001f7d3800 - 0000000020000000 (reserved)
Aug  4 13:50:15 holmes86 kernel:  BIOS-e820: 00000000e0000000 - 00000000f0007000 (reserved)
Aug  4 13:50:15 holmes86 kernel:  BIOS-e820: 00000000f0008000 - 00000000f000c000 (reserved)

从上面的信息能够看出,检查 /proc/8663/fd/15 就能够得到所要康复的数据。假设能够经过文件描述符检查相应的数据,那么就能够运用 I/O 重定向将其复制到文件中,如:

cat /proc/1283/fd/2 /var/log/messages

关于许多运用程序,尤其是日志文件和数据库,这种康复删去文件的办法十分有用。
版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表威尼斯人立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章