#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 表示兩個參數都必須知足時才顯示結果
相關文章
相關標籤/搜索