#linux包之lsof之lsof命令

2015/3/18查漏补缺,反复练习命令,有不明白或疑问的地方直接看man手册页,英文解释的比较清楚java

man lsof  已阅node

概述mysql

[root@localhost ~]# rpm -qa|grep lsof
lsof-4.82-4.el6.x86_64
在终端下输入lsof便可显示系统打开的文件,由于 lsof 须要访问核心内存和各类文件,因此必须以 root 用户的身份运行它才可以充分地发挥其功能。每行显示一个打开的文件,若不指定条件默认将显示全部进程打开的全部文件。linux

lsof - list open files

Lsof revision 4.82 lists on its standard output file information about files opened by processes for the following UNIX dialects:

AIX 5.3
Apple Darwin 9 (Mac OS X 10.5)
FreeBSD 4.9 for x86-based systems
FreeBSD 7.[012] and 8.0 for AMD64-based systems
Linux 2.1.72 and above for x86-based systems
Solaris 9 and 10

An  open  file  may  be  a  regular  file,  a directory, a block special file, a character special file, an executing text reference, a library, a stream or a network file (Internet socket, NFS file or UNIX domain socket.)  A specific file or all the files in a file system may be selected by path.

 

fuser - identify processes using files or sockets
fuser  displays  the  PIDs of processes using the specified files or file systems.  In the default display mode, each file name is followed by a letter denoting the type of access:
fuser outputs only the PIDs to stdout, everything else is sent to stderr.

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

sql

解释数据库

 

[root@localhost ~]# man lsof  看了两个多小时,包括全部的选项,输出格式的每一个字段的解释,样例等
If any list request option is specified, other list requests must be specifically requested
就是说选项必须被明确地指定。-U列出socket,不会列出nfs files,除非指定-N。
Normally list options that are specifically stated are ORed
正常列表默认是或的关系,好比 -i -ufoo,列出全部的网络文件或者属于进程全部者为foo的列表。
lsof -a 表示两个参数都必须知足时才显示结果  明确用-a指定为与关系

lsof输出各列信息的意义以下:man lsof对此有详尽的解释
COMMAND: 进程的名称
PID:   进程标识符
USER:  进程全部者
FD:    文件描述符,应用程序经过文件描述符识别该文件。如cwd、txt等
TYPE: 文件类型,如DIR、REG等
DEVICE: 指定磁盘的名称
SIZE: 文件的大小
NODE: 索引节点(文件在磁盘上的标识)
NAME: 打开文件的确切名称

FD 列中的文件描述符
1.cwd 值表示应用程序的当前工做目录,这是该应用程序启动的目录,除非它自己对这个目录进行更改
2.txt 类型的文件是程序代码,如应用程序二进制文件自己或共享库,如上列表中显示的 /sbin/init 程序。
3.mem
4.rtd
5.其次数值表示应用程序的文件描述符,这是打开该文件时返回的一个整数。如上的最后一行文件/dev/initctl,其文件描述符为 10。
u 表示该文件被打开并处于读取/写入模式,而不是只读(r)或只写(w)模式。
W 表示该应用程序具备对整个文件的写锁。该文件描述符用于确保每次只能打开一个应用程序实例。
[root@CentOS5 ~]# lsof|grep W(写锁)    lsof|grep unix (其实就是套接字)  lsof|grep FIFO(其实就是管道)  lsof|grep Ipv4(其实就是tcp/ip)
初始打开每一个应用程序时,都具备三个文件描述符,从 02,分别表示标准输入、输出和错误流。因此大多数应用程序所打开的文件的 FD 都是从 3 开始。
sshd 26592 root 5r FIFO 0,6 1882595 pipe
sshd 26592 root 6w FIFO 0,6 1882595 pipe
unix 0xf1e75c80
FIFO 0,6
FIFO 8,3
IPv4 10338

Type 列则比较直观。文件和目录分别称为 REG 和 DIR。而CHR 和 BLK,分别表示字符和块设备;
或者 UNIX、FIFO 和 IPv4,分别表示 UNIX 域套接字、先进先出 (FIFO) 队列和网际协议 (IP) 套接字。

 

 

 

命令列表apache

lsof `which httpd` //那个进程在使用apache的可执行文件
lsof /etc/passwd //那个进程在占用/etc/passwd
lsof /dev/hda6 //那个进程在占用hda6
lsof /dev/cdrom //那个进程在占用光驱
lsof -c sendmail //查看sendmail进程的文件使用状况
lsof -c courier -u ^zahn //显示出那些文件被以courier打头的进程打开,可是并不属于用户zahn
lsof -p 30297 //显示那些文件被pid为30297的进程打开
lsof -u1000 //查看uid是100的用户的进程的文件使用状况
lsof -utony //查看用户tony的进程的文件使用状况
lsof -u^tony //查看不是用户tony的进程的文件使用状况(^是取反的意思)
lsof -i //显示全部打开的端口
lsof -i:80 //显示全部打开80端口的进程
lsof -i -U //显示全部打开的端口和UNIX domain文件
lsof -i UDP@[url]www.akadia.com:123 //显示那些进程打开了到www.akadia.com的UDP的123(ntp)端口的连接
lsof -i tcp@ohaha.ks.edu.tw:ftp -r //不断查看目前ftp链接的状况(-r,lsof会永远不断的执行,直到收到中断信号,+r,lsof会一直执行,直到没有档案被显示,缺省是15s刷新)
lsof -i tcp@ohaha.ks.edu.tw:ftp -n //lsof -n 不将IP转换为hostname,缺省是不加上-n参数
lsof -a 表示两个参数都必须知足时才显示结果
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 --> 端口号 (能够不仅一个)

lsof -p pid  //查看进程pid打开的文件描述符,(通常状况下,一个进程能够打开的文件描述符的个数不超过1024)
防止文件描述符泄露,内存泄露不只仅是堆内存泄露,还有句柄泄漏。
df -l 和du -sh 统计到的文件大小不一样,多是由于文件目录项被删除了,可是文件还被打开着,inode还被占用着。

查看所属root用户进程所打开的文件类型为txt的文件:
# lsof -u root -a -d txt 

 

###下面是在本地查看相关链接vim

[root@8A_4 ~]# lsof -i@192.168.1.78
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    5939 root    3r  IPv4  17600      0t0  TCP 172.16.1.16:ssh->192.168.1.78:mysql-cluster (ESTABLISHED)
sshd    5941  lzb    3u  IPv4  17600      0t0  TCP 172.16.1.16:ssh->192.168.1.78:mysql-cluster (ESTABLISHED)
sshd    6161 root    3r  IPv4  22946      0t0  TCP 172.16.1.16:ssh->192.168.1.78:commlinx-avl (ESTABLISHED)
sshd    6163  lzb    3u  IPv4  22946      0t0  TCP 172.16.1.16:ssh->192.168.1.78:commlinx-avl (ESTABLISHED)
[root@8A_4 ~]# lsof -i@192.168.1.78 -a -ulzb
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    5941  lzb    3u  IPv4  17600      0t0  TCP 172.16.1.16:ssh->192.168.1.78:mysql-cluster (ESTABLISHED)
sshd    6163  lzb    3u  IPv4  22946      0t0  TCP 172.16.1.16:ssh->192.168.1.78:commlinx-avl (ESTABLISHED)
[root@8A_4 ~]# lsof -i@192.168.1.78 -i@192.168.1.82 -a -uroot
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    5939 root    3r  IPv4  17600      0t0  TCP 172.16.1.16:ssh->192.168.1.78:mysql-cluster (ESTABLISHED)
sshd    6161 root    3r  IPv4  22946      0t0  TCP 172.16.1.16:ssh->192.168.1.78:commlinx-avl (ESTABLISHED)
sshd    7367 root    3r  IPv4  27271      0t0  TCP 172.16.1.16:ssh->192.168.1.82:bridgecontrol (ESTABLISHED)

 

###卸载文件系统bash

在卸载文件系统时,若是该文件系统中有任何打开的文件,操做一般将会失败。那么经过lsof能够找出那些进程在使用当前要卸载的文件系统,以下:
[root@84-monitor monitor]# lsof /home/cc
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
bash    14848 root  cwd    DIR   0,21     4096 800765 /home/cc
[root@84-monitor monitor]# umount /home/cc
umount.nfs: /home/cc: device is busy
umount.nfs: /home/cc: device is busy
最后知道是有进程停留在此目录,经过FD列的cwd可知,只要退出此层目录,即可以卸载此文件系统了。

# 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)的缘由,以免该守护进程阻止卸载不相关的文件系统。

 

###显示打开指定文件的全部进程网络

[root@250-shiyan ~]# lsof /lib64/libc-2.12.so
COMMAND     PID    USER  FD   TYPE DEVICE SIZE/OFF   NODE NAME
init          1    root mem    REG  253,0  1921216 260624 /lib64/libc-2.12.so
udevd       379    root mem    REG  253,0  1921216 260624 /lib64/libc-2.12.so
auditd      934    root mem    REG  253,0  1921216 260624 /lib64/libc-2.12.so
rsyslogd    950    root mem    REG  253,0  1921216 260624 /lib64/libc-2.12.so
rpcbind     973     rpc mem    REG  253,0  1921216 260624 /lib64/libc-2.12.so
rpc.statd   991 rpcuser mem    REG  253,0  1921216 260624 /lib64/libc-2.12.so
master     1120    root mem    REG  253,0  1921216 260624 /lib64/libc-2.12.so
qmgr       1129 postfix mem    REG  253,0  1921216 260624 /lib64/libc-2.12.so
crond      1130    root mem    REG  253,0  1921216 260624 /lib64/libc-2.12.so
mingetty   1143    root mem    REG  253,0  1921216 260624 /lib64/libc-2.12.so
mingetty   1145    root mem    REG  253,0  1921216 260624 /lib64/libc-2.12.so
mingetty   1147    root mem    REG  253,0  1921216 260624 /lib64/libc-2.12.so
mingetty   1149    root mem    REG  253,0  1921216 260624 /lib64/libc-2.12.so
mingetty   1151    root mem    REG  253,0  1921216 260624 /lib64/libc-2.12.so
mingetty   1153    root mem    REG  253,0  1921216 260624 /lib64/libc-2.12.so
udevd      1159    root mem    REG  253,0  1921216 260624 /lib64/libc-2.12.so
udevd      1160    root mem    REG  253,0  1921216 260624 /lib64/libc-2.12.so
sshd      12432    root mem    REG  253,0  1921216 260624 /lib64/libc-2.12.so
rpc.mount 14820    root mem    REG  253,0  1921216 260624 /lib64/libc-2.12.so
rpc.idmap 14858    root mem    REG  253,0  1921216 260624 /lib64/libc-2.12.so
pickup    19686 postfix mem    REG  253,0  1921216 260624 /lib64/libc-2.12.so
sshd      19757    root mem    REG  253,0  1921216 260624 /lib64/libc-2.12.so
bash      19759    root mem    REG  253,0  1921216 260624 /lib64/libc-2.12.so
sshd      19783    root mem    REG  253,0  1921216 260624 /lib64/libc-2.12.so
bash      19785    root mem    REG  253,0  1921216 260624 /lib64/libc-2.12.so
lsof      19811    root mem    REG  253,0  1921216 260624 /lib64/libc-2.12.so
lsof      19812    root mem    REG  253,0  1921216 260624 /lib64/libc-2.12.so

 

通常来讲,以pid或以命令名显示的打开文件数应该是同样的
[root@250-shiyan ~]# ps -ef|grep crond
root      1130     1  0 Jan13 ?        00:00:16 crond
[root@250-shiyan ~]# lsof -c crond|wc -l
20
[root@250-shiyan ~]# lsof -p 1130|wc -l
20

 

###以命令关键字查看打开文件数

[root@250-shiyan ~]# lsof -c crond
COMMAND  PID USER   FD   TYPE             DEVICE SIZE/OFF   NODE NAME
crond   1130 root  cwd    DIR              253,0     4096      2 /
crond   1130 root  rtd    DIR              253,0     4096      2 /
crond   1130 root  txt    REG              253,0    64096 396039 /usr/sbin/crond
crond   1130 root  mem    REG              253,0    65928 260640 /lib64/libnss_files-2.12.so
crond   1130 root  mem    REG              253,0 99158576 393113 /usr/lib/locale/locale-archive
crond   1130 root  mem    REG              253,0   469528 260616 /lib64/libfreebl3.so
crond   1130 root  mem    REG              253,0    40400 260628 /lib64/libcrypt-2.12.so
crond   1130 root  mem    REG              253,0  1921216 260624 /lib64/libc-2.12.so
crond   1130 root  mem    REG              253,0   113096 260680 /lib64/libaudit.so.1.0.0
crond   1130 root  mem    REG              253,0    19536 260630 /lib64/libdl-2.12.so
crond   1130 root  mem    REG              253,0    55848 260793 /lib64/libpam.so.0.82.2
crond   1130 root  mem    REG              253,0   122040 260694 /lib64/libselinux.so.1
crond   1130 root  mem    REG              253,0   154520 260617 /lib64/ld-2.12.so
crond   1130 root    0u   CHR                1,3      0t0   3782 /dev/null
crond   1130 root    1u   CHR                1,3      0t0   3782 /dev/null
crond   1130 root    2u   CHR                1,3      0t0   3782 /dev/null
crond   1130 root    3u   REG              253,0        5 523959 /var/run/crond.pid
crond   1130 root    4u  unix 0xffff88001dbec3c0      0t0   8775 socket
crond   1130 root    5r   DIR               0,10        0      1 inotify

 

###以pid或者文件描述符查看打开文件数

[root@250-shiyan ~]# lsof -p 1130
COMMAND  PID USER   FD   TYPE             DEVICE SIZE/OFF   NODE NAME
crond   1130 root  cwd    DIR              253,0     4096      2 /
crond   1130 root  rtd    DIR              253,0     4096      2 /
crond   1130 root  txt    REG              253,0    64096 396039 /usr/sbin/crond
crond   1130 root  mem    REG              253,0    65928 260640 /lib64/libnss_files-2.12.so
crond   1130 root  mem    REG              253,0 99158576 393113 /usr/lib/locale/locale-archive
crond   1130 root  mem    REG              253,0   469528 260616 /lib64/libfreebl3.so
crond   1130 root  mem    REG              253,0    40400 260628 /lib64/libcrypt-2.12.so
crond   1130 root  mem    REG              253,0  1921216 260624 /lib64/libc-2.12.so
crond   1130 root  mem    REG              253,0   113096 260680 /lib64/libaudit.so.1.0.0
crond   1130 root  mem    REG              253,0    19536 260630 /lib64/libdl-2.12.so
crond   1130 root  mem    REG              253,0    55848 260793 /lib64/libpam.so.0.82.2
crond   1130 root  mem    REG              253,0   122040 260694 /lib64/libselinux.so.1
crond   1130 root  mem    REG              253,0   154520 260617 /lib64/ld-2.12.so
crond   1130 root    0u   CHR                1,3      0t0   3782 /dev/null
crond   1130 root    1u   CHR                1,3      0t0   3782 /dev/null
crond   1130 root    2u   CHR                1,3      0t0   3782 /dev/null
crond   1130 root    3u   REG              253,0        5 523959 /var/run/crond.pid
crond   1130 root    4u  unix 0xffff88001dbec3c0      0t0   8775 socket
crond   1130 root    5r   DIR               0,10        0      1 inotify

[root@fileserv samba]# lsof -d 4
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
udevd 310 root 4u sock 0,5 980 can't identify protocol
auditd 1039 root 4r 0000 0,11 0 2932 eventpoll
audispd 1041 root 4w FIFO 0,6 2920 pipe
syslogd 1061 root 4w REG 202,3 164744 1237905 /var/log/maillog
portmap 1101 rpc 4u IPv4 3106 TCP *:sunrpc (LISTEN)
rpc.statd 1132 root 4w FIFO 0,6 3137 pipe
dbus-daem 1167 dbus 4u CHR 1,3 964 /dev/null
pcscd 1205 root 4u unix 0xdd23c900 3350 socket
hidd 1252 root 4u sock 0,5 3727 can't identify protocol
automount 1271 root 4r FIFO 0,6 3790 pipe
cupsd 1328 root 4u IPv4 3910 TCP localhost.localdomain:ipp (LISTEN)
gpm 1347 root 4u CHR 13,63 1413 /dev/input/mice

 

###查看某个目录下被打开的文件数而且递归子目录

[root@221-comecs ~]# lsof +D /var/
COMMAND     PID    USER   FD   TYPE             DEVICE SIZE/OFF     NODE NAME
vmtoolsd   1191    root    4w   REG              253,0        5   521803 /var/run/vmtoolsd.pid
auditd     1279    root    5w   REG              253,0  4969946   524922 /var/log/audit/audit.log
rsyslogd   1295    root    1w   REG              253,0      806   527133 /var/log/messages
rsyslogd   1295    root    2w   REG              253,0    41104   527080 /var/log/cron
rsyslogd   1295    root    4w   REG              253,0  3850519   527135 /var/log/secure
rsyslogd   1295    root    5w   REG              253,0     1214   527120 /var/log/maillog
rpcbind    1318     rpc    3r   REG              253,0        0   521841 /var/run/rpcbind.lock
rpcbind    1318     rpc    5u  unix 0xffff8800379713c0      0t0     9050 /var/run/rpcbind.sock
rpc.statd  1336 rpcuser  cwd    DIR              253,0     4096   521898 /var/lib/nfs/statd
rpc.statd  1336 rpcuser    6w   REG              253,0        5   521845 /var/run/rpc.statd.pid
master     1467    root  cwd    DIR              253,0     4096   521524 /var/spool/postfix
master     1467    root    9uW  REG              253,0       33   521942 /var/spool/postfix/pid/master.pid
master     1467    root   10uW  REG              253,0       33   521814 /var/lib/postfix/master.lock
master     1467    root   17u  FIFO              253,0      0t0   521816 /var/spool/postfix/public/pickup
master     1467    root   23u  FIFO              253,0      0t0   521818 /var/spool/postfix/public/qmgr
qmgr       1475 postfix  cwd    DIR              253,0     4096   521524 /var/spool/postfix
qmgr       1475 postfix    6u  FIFO              253,0      0t0   521818 /var/spool/postfix/public/qmgr
asterisk   2451    root    3u  unix 0xffff88003dc6c6c0      0t0 15574164 /var/run/asterisk.ctl
asterisk   2451    root    4w   REG              253,0    16550   521941 /var/log/asterisk/messages
asterisk   2451    root    5w   REG              253,0        0   521943 /var/log/asterisk/event_log
asterisk   2451    root    6w   REG              253,0     2154   524874 /var/log/asterisk/queue_log
asterisk   2451    root    7u   REG              253,0        0   524865 /var/lib/asterisk/astdb
crond     25396    root    3u   REG              253,0        6   524871 /var/run/crond.pid
pickup    26803 postfix  cwd    DIR              253,0     4096   521524 /var/spool/postfix
pickup    26803 postfix    6u  FIFO              253,0      0t0   521816 /var/spool/postfix/public/pickup

 

###查看某个目录下被打开的文件数,是+d选项

[root@221-comecs ~]# lsof +d /var/log
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
rsyslogd 1295 root    1w   REG  253,0      806 527133 /var/log/messages
rsyslogd 1295 root    2w   REG  253,0    41104 527080 /var/log/cron
rsyslogd 1295 root    4w   REG  253,0  3850519 527135 /var/log/secure
rsyslogd 1295 root    5w   REG  253,0     1214 527120 /var/log/maillog
[root@221-comecs ~]# lsof +d /var/log/asterisk/
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
asterisk 2451 root    4w   REG  253,0    16550 521941 /var/log/asterisk/messages
asterisk 2451 root    5w   REG  253,0        0 521943 /var/log/asterisk/event_log
asterisk 2451 root    6w   REG  253,0     2154 524874 /var/log/asterisk/queue_log

 

###过程分析

对待每个守护进程都是这个过程。
一。先查看系统中都有哪些进程在运行
[root@84-monitor logs]# pstree
init─┬─auditd───{auditd}
     ├─crond───4*[crond─┬─sendmail───postdrop]
     │                  └─sh───sh───sh───sh───mail───mail]
     ├─httpd───8*[httpd]
     ├─java───23*[{java}]
     ├─master─┬─cleanup
     │        ├─local
     │        ├─pickup
     │        └─qmgr
     ├─6*[mingetty]
     ├─mysqld_safe───mysqld───9*[{mysqld}]
     ├─rpc.statd
     ├─rpcbind
     ├─rsyslogd───3*[{rsyslogd}]
     ├─sshd─┬─sshd───bash───pstree
     │      └─3*[sshd───bash───bash───ssh]
     └─udevd───2*[udevd] 二。其次列出以rsys开头的进程打开的全部文件 [root@
84-monitor 972]# lsof -c rsys COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rsyslogd 972 root cwd DIR 253,0 4096 2 / rsyslogd 972 root rtd DIR 253,0 4096 2 / rsyslogd 972 root txt REG 253,0 396064 521732 /sbin/rsyslogd rsyslogd 972 root mem REG 253,0 27232 521711 /lib64/rsyslog/imklog.so rsyslogd 972 root mem REG 253,0 340568 521717 /lib64/rsyslog/imuxsock.so rsyslogd 972 root mem REG 253,0 110960 521867 /lib64/libresolv-2.12.so rsyslogd 972 root mem REG 253,0 27424 521245 /lib64/libnss_dns-2.12.so rsyslogd 972 root mem REG 253,0 65928 521865 /lib64/libnss_files-2.12.so rsyslogd 972 root mem REG 253,0 26984 521718 /lib64/rsyslog/lmnet.so rsyslogd 972 root mem REG 253,0 1921176 521231 /lib64/libc-2.12.so rsyslogd 972 root mem REG 253,0 90880 521844 /lib64/libgcc_s-4.4.7-20120601.so.1 rsyslogd 972 root mem REG 253,0 43880 521868 /lib64/librt-2.12.so rsyslogd 972 root mem REG 253,0 19536 521861 /lib64/libdl-2.12.so rsyslogd 972 root mem REG 253,0 142640 521255 /lib64/libpthread-2.12.so rsyslogd 972 root mem REG 253,0 88600 521285 /lib64/libz.so.1.2.3 rsyslogd 972 root mem REG 253,0 154624 521489 /lib64/ld-2.12.so rsyslogd 972 root 0u unix 0xffff88001fbd06c0 0t0 10252 /dev/log rsyslogd 972 root 1w REG 253,0 292 786284 /var/log/messages rsyslogd 972 root 2w REG 253,0 1191255 785232 /var/log/cron rsyslogd 972 root 3r REG 0,3 0 4026532040 /proc/kmsg rsyslogd 972 root 4w REG 253,0 564219 785245 /var/log/maillog rsyslogd 972 root 5w REG 253,0 1004 786285 /var/log/secure 三。随后进入到972的fd目录,列出文件列表,打开了5个文件 [root@84-monitor 972]# cd /proc/972/fd [root@84-monitor fd]# ll total 0 lrwx------. 1 root root 64 Mar 18 09:39 0 -> socket:[10252] l-wx------. 1 root root 64 Mar 18 09:39 1 -> /var/log/messages l-wx------. 1 root root 64 Mar 18 09:39 2 -> /var/log/cron lr-x------. 1 root root 64 Mar 18 09:39 3 -> /proc/kmsg l-wx------. 1 root root 64 Mar 18 09:39 4 -> /var/log/maillog l-wx------. 1 root root 64 Mar 18 09:39 5 -> /var/log/secure 四。查漏补缺 FD列 txt program text (code and data); rtd root directory; cwd current working directory; cwd,rtd这两个常常是同样的,由于若是没有具体的目录的话,默认全放到根下。 mem memory-mapped file; u for read and write access; TYPE列 unix for a UNIX domain socket; REG for a regular file; DIR for a directory; 一。 [root@84-monitor fd]# lsof -c rpcbind COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rpcbind 32580 rpc cwd DIR 253,0 4096 2 / rpcbind 32580 rpc rtd DIR 253,0 4096 2 / rpcbind 32580 rpc txt REG 253,0 54408 521226 /sbin/rpcbind rpcbind 32580 rpc mem REG 253,0 65928 521865 /lib64/libnss_files-2.12.so rpcbind 32580 rpc mem REG 253,0 1921176 521231 /lib64/libc-2.12.so rpcbind 32580 rpc mem REG 253,0 142640 521255 /lib64/libpthread-2.12.so rpcbind 32580 rpc mem REG 253,0 19536 521861 /lib64/libdl-2.12.so rpcbind 32580 rpc mem REG 253,0 36584 521220 /lib64/libgssglue.so.1.0.0 rpcbind 32580 rpc mem REG 253,0 113432 521863 /lib64/libnsl-2.12.so rpcbind 32580 rpc mem REG 253,0 162016 521225 /lib64/libtirpc.so.1.0.10 rpcbind 32580 rpc mem REG 253,0 40792 521329 /lib64/libwrap.so.0.7.6 rpcbind 32580 rpc mem REG 253,0 154624 521489 /lib64/ld-2.12.so rpcbind 32580 rpc 0u CHR 1,3 0t0 3782 /dev/null rpcbind 32580 rpc 1u CHR 1,3 0t0 3782 /dev/null rpcbind 32580 rpc 2u CHR 1,3 0t0 3782 /dev/null rpcbind 32580 rpc 3r REG 253,0 0 786245 /var/run/rpcbind.lock rpcbind 32580 rpc 4u sock 0,6 0t0 3617563 can't identify protocol rpcbind 32580 rpc 5u unix 0xffff88001dfc3080 0t0 3617538 /var/run/rpcbind.sock rpcbind 32580 rpc 6u IPv4 3617540 0t0 UDP *:sunrpc rpcbind 32580 rpc 7u IPv4 3617542 0t0 UDP *:955 rpcbind 32580 rpc 8u IPv4 3617543 0t0 TCP *:sunrpc (LISTEN) rpcbind 32580 rpc 9u IPv6 3617545 0t0 UDP *:sunrpc rpcbind 32580 rpc 10u IPv6 3617547 0t0 UDP *:955 rpcbind 32580 rpc 11u IPv6 3617548 0t0 TCP *:sunrpc (LISTEN) 二。查漏补缺 TYPE列 sock for a socket of unknown domain; IPv4 for an IPv4 socket; IPv6 for an open IPv6 network file - even if its address is IPv4, mapped in an IPv6 address;

 

案例

恢复删除的文件
当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
对于许多应用程序,尤为是日志文件和数据库,这种恢复删除文件的方法很是有用。

lsof -a 表示两个参数都必须知足时才显示结果
相关文章
相关标签/搜索