#linux包之lsof之lsof命令

时间:2021-11-18 18:46:51

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

man lsof  已阅

概述

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

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 (Mac OS X 10.5)
FreeBSD 4.9 for x86-based systems
FreeBSD .[] and 8.0 for AMD64-based systems
Linux 2.1. and above for x86-based systems
Solaris and 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工具能够查看这个列表对系统监测以及排错将是很有帮助的。

解释

[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 列中的文件描述符
.cwd 值表示应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改
.txt 类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序。
.mem
.rtd
.其次数值表示应用程序的文件描述符,这是打开该文件时返回的一个整数。如上的最后一行文件/dev/initctl,其文件描述符为 。
u 表示该文件被打开并处于读取/写入模式,而不是只读(r)或只写(w)模式。
W 表示该应用程序具有对整个文件的写锁。该文件描述符用于确保每次只能打开一个应用程序实例。
[root@CentOS5 ~]# lsof|grep W(写锁)    lsof|grep unix (其实就是套接字)  lsof|grep FIFO(其实就是管道)  lsof|grep Ipv4(其实就是tcp/ip)
初始打开每个应用程序时,都具有三个文件描述符,从 到 ,分别表示标准输入、输出和错误流。所以大多数应用程序所打开的文件的 FD 都是从 开始。
sshd root 5r FIFO , pipe
sshd root 6w FIFO , pipe
unix 0xf1e75c80
FIFO ,
FIFO ,
IPv4 Type 列则比较直观。文件和目录分别称为 REG 和 DIR。而CHR 和 BLK,分别表示字符和块设备;
或者 UNIX、FIFO 和 IPv4,分别表示 UNIX 域套接字、先进先出 (FIFO) 队列和网际协议 (IP) 套接字。

命令列表

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 //显示那些文件被pid为30297的进程打开
lsof -u1000 //查看uid是100的用户的进程的文件使用情况
lsof -utony //查看用户tony的进程的文件使用情况
lsof -u^tony //查看不是用户tony的进程的文件使用情况(^是取反的意思)
lsof -i //显示所有打开的端口
lsof -i: //显示所有打开80端口的进程
lsof -i -U //显示所有打开的端口和UNIX domain文件
lsof -i UDP@[url]www.akadia.com: //显示那些进程打开了到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[] [protocol][@hostname|hostaddr][:service|port]
--> 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

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

[root@8A_4 ~]# lsof -i@192.168.1.78
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd root 3r IPv4 0t0 TCP 172.16.1.16:ssh->192.168.1.78:mysql-cluster (ESTABLISHED)
sshd lzb 3u IPv4 0t0 TCP 172.16.1.16:ssh->192.168.1.78:mysql-cluster (ESTABLISHED)
sshd root 3r IPv4 0t0 TCP 172.16.1.16:ssh->192.168.1.78:commlinx-avl (ESTABLISHED)
sshd lzb 3u IPv4 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 lzb 3u IPv4 0t0 TCP 172.16.1.16:ssh->192.168.1.78:mysql-cluster (ESTABLISHED)
sshd lzb 3u IPv4 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 root 3r IPv4 0t0 TCP 172.16.1.16:ssh->192.168.1.78:mysql-cluster (ESTABLISHED)
sshd root 3r IPv4 0t0 TCP 172.16.1.16:ssh->192.168.1.78:commlinx-avl (ESTABLISHED)
sshd root 3r IPv4 0t0 TCP 172.16.1.16:ssh->192.168.1.82:bridgecontrol (ESTABLISHED)

###卸载文件系统

在卸载文件系统时,如果该文件系统中有任何打开的文件,操作通常将会失败。那么通过lsof可以找出那些进程在使用当前要卸载的文件系统,如下:
[root@-monitor monitor]# lsof /home/cc
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash root cwd DIR , /home/cc
[root@-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 root cwd DIR , /GTES11/
vim root cwd DIR , /GTES11/
在这个示例中,用户root正在其/GTES11目录中进行一些操作。一个 bash是实例正在运行,并且它当前的目录为/GTES11,另一个则显示的是vim正在编辑/GTES11下的文件。要成功地卸载/GTES11,应该在通知用户以确保情况正常之后,中止这些进程。 这个示例说明了应用程序的当前工作目录非常重要,因为它仍保持着文件资源,并且可以防止文件系统被卸载。这就是为什么大部分守护进程(后台进程)将它们的目录更改为根目录、或服务特定的目录(如 sendmail 示例中的 /var/spool/mqueue)的原因,以避免该守护进程阻止卸载不相关的文件系统。

###显示打开指定文件的所有进程

[root@-shiyan ~]# lsof /lib64/libc-2.12.so
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init root mem REG , /lib64/libc-2.12.so
udevd root mem REG , /lib64/libc-2.12.so
auditd root mem REG , /lib64/libc-2.12.so
rsyslogd root mem REG , /lib64/libc-2.12.so
rpcbind rpc mem REG , /lib64/libc-2.12.so
rpc.statd rpcuser mem REG , /lib64/libc-2.12.so
master root mem REG , /lib64/libc-2.12.so
qmgr postfix mem REG , /lib64/libc-2.12.so
crond root mem REG , /lib64/libc-2.12.so
mingetty root mem REG , /lib64/libc-2.12.so
mingetty root mem REG , /lib64/libc-2.12.so
mingetty root mem REG , /lib64/libc-2.12.so
mingetty root mem REG , /lib64/libc-2.12.so
mingetty root mem REG , /lib64/libc-2.12.so
mingetty root mem REG , /lib64/libc-2.12.so
udevd root mem REG , /lib64/libc-2.12.so
udevd root mem REG , /lib64/libc-2.12.so
sshd root mem REG , /lib64/libc-2.12.so
rpc.mount root mem REG , /lib64/libc-2.12.so
rpc.idmap root mem REG , /lib64/libc-2.12.so
pickup postfix mem REG , /lib64/libc-2.12.so
sshd root mem REG , /lib64/libc-2.12.so
bash root mem REG , /lib64/libc-2.12.so
sshd root mem REG , /lib64/libc-2.12.so
bash root mem REG , /lib64/libc-2.12.so
lsof root mem REG , /lib64/libc-2.12.so
lsof root mem REG , /lib64/libc-2.12.so
一般来说,以pid或以命令名显示的打开文件数应该是一样的
[root@-shiyan ~]# ps -ef|grep crond
root Jan13 ? :: crond
[root@-shiyan ~]# lsof -c crond|wc -l [root@-shiyan ~]# lsof -p |wc -l

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

[root@-shiyan ~]# lsof -c crond
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
crond root cwd DIR , /
crond root rtd DIR , /
crond root txt REG , /usr/sbin/crond
crond root mem REG , /lib64/libnss_files-2.12.so
crond root mem REG , /usr/lib/locale/locale-archive
crond root mem REG , /lib64/libfreebl3.so
crond root mem REG , /lib64/libcrypt-2.12.so
crond root mem REG , /lib64/libc-2.12.so
crond root mem REG , /lib64/libaudit.so.1.0.
crond root mem REG , /lib64/libdl-2.12.so
crond root mem REG , /lib64/libpam.so.0.82.
crond root mem REG , /lib64/libselinux.so.
crond root mem REG , /lib64/ld-2.12.so
crond root 0u CHR , 0t0 /dev/null
crond root 1u CHR , 0t0 /dev/null
crond root 2u CHR , 0t0 /dev/null
crond root 3u REG , /var/run/crond.pid
crond root 4u unix 0xffff88001dbec3c0 0t0 socket
crond root 5r DIR , inotify

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

[root@-shiyan ~]# lsof -p
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
crond root cwd DIR , /
crond root rtd DIR , /
crond root txt REG , /usr/sbin/crond
crond root mem REG , /lib64/libnss_files-2.12.so
crond root mem REG , /usr/lib/locale/locale-archive
crond root mem REG , /lib64/libfreebl3.so
crond root mem REG , /lib64/libcrypt-2.12.so
crond root mem REG , /lib64/libc-2.12.so
crond root mem REG , /lib64/libaudit.so.1.0.
crond root mem REG , /lib64/libdl-2.12.so
crond root mem REG , /lib64/libpam.so.0.82.
crond root mem REG , /lib64/libselinux.so.
crond root mem REG , /lib64/ld-2.12.so
crond root 0u CHR , 0t0 /dev/null
crond root 1u CHR , 0t0 /dev/null
crond root 2u CHR , 0t0 /dev/null
crond root 3u REG , /var/run/crond.pid
crond root 4u unix 0xffff88001dbec3c0 0t0 socket
crond root 5r DIR , 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@-comecs ~]# lsof +D /var/
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
vmtoolsd root 4w REG , /var/run/vmtoolsd.pid
auditd root 5w REG , /var/log/audit/audit.log
rsyslogd root 1w REG , /var/log/messages
rsyslogd root 2w REG , /var/log/cron
rsyslogd root 4w REG , /var/log/secure
rsyslogd root 5w REG , /var/log/maillog
rpcbind rpc 3r REG , /var/run/rpcbind.lock
rpcbind rpc 5u unix 0xffff8800379713c0 0t0 /var/run/rpcbind.sock
rpc.statd rpcuser cwd DIR , /var/lib/nfs/statd
rpc.statd rpcuser 6w REG , /var/run/rpc.statd.pid
master root cwd DIR , /var/spool/postfix
master root 9uW REG , /var/spool/postfix/pid/master.pid
master root 10uW REG , /var/lib/postfix/master.lock
master root 17u FIFO , 0t0 /var/spool/postfix/public/pickup
master root 23u FIFO , 0t0 /var/spool/postfix/public/qmgr
qmgr postfix cwd DIR , /var/spool/postfix
qmgr postfix 6u FIFO , 0t0 /var/spool/postfix/public/qmgr
asterisk root 3u unix 0xffff88003dc6c6c0 0t0 /var/run/asterisk.ctl
asterisk root 4w REG , /var/log/asterisk/messages
asterisk root 5w REG , /var/log/asterisk/event_log
asterisk root 6w REG , /var/log/asterisk/queue_log
asterisk root 7u REG , /var/lib/asterisk/astdb
crond root 3u REG , /var/run/crond.pid
pickup postfix cwd DIR , /var/spool/postfix
pickup postfix 6u FIFO , 0t0 /var/spool/postfix/public/pickup

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

[root@-comecs ~]# lsof +d /var/log
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsyslogd root 1w REG , /var/log/messages
rsyslogd root 2w REG , /var/log/cron
rsyslogd root 4w REG , /var/log/secure
rsyslogd root 5w REG , /var/log/maillog
[root@-comecs ~]# lsof +d /var/log/asterisk/
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
asterisk root 4w REG , /var/log/asterisk/messages
asterisk root 5w REG , /var/log/asterisk/event_log
asterisk root 6w REG , /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@-monitor ]# lsof -c rsys
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsyslogd root cwd DIR , /
rsyslogd root rtd DIR , /
rsyslogd root txt REG , /sbin/rsyslogd
rsyslogd root mem REG , /lib64/rsyslog/imklog.so
rsyslogd root mem REG , /lib64/rsyslog/imuxsock.so
rsyslogd root mem REG , /lib64/libresolv-2.12.so
rsyslogd root mem REG , /lib64/libnss_dns-2.12.so
rsyslogd root mem REG , /lib64/libnss_files-2.12.so
rsyslogd root mem REG , /lib64/rsyslog/lmnet.so
rsyslogd root mem REG , /lib64/libc-2.12.so
rsyslogd root mem REG , /lib64/libgcc_s-4.4.-.so.
rsyslogd root mem REG , /lib64/librt-2.12.so
rsyslogd root mem REG , /lib64/libdl-2.12.so
rsyslogd root mem REG , /lib64/libpthread-2.12.so
rsyslogd root mem REG , /lib64/libz.so.1.2.
rsyslogd root mem REG , /lib64/ld-2.12.so
rsyslogd root 0u unix 0xffff88001fbd06c0 0t0 /dev/log
rsyslogd root 1w REG , /var/log/messages
rsyslogd root 2w REG , /var/log/cron
rsyslogd root 3r REG , /proc/kmsg
rsyslogd root 4w REG , /var/log/maillog
rsyslogd root 5w REG , /var/log/secure 三。随后进入到972的fd目录,列出文件列表,打开了5个文件
[root@-monitor ]# cd /proc//fd
[root@-monitor fd]# ll
total
lrwx------. root root Mar : -> socket:[]
l-wx------. root root Mar : -> /var/log/messages
l-wx------. root root Mar : -> /var/log/cron
lr-x------. root root Mar : -> /proc/kmsg
l-wx------. root root Mar : -> /var/log/maillog
l-wx------. root root Mar : -> /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@-monitor fd]# lsof -c rpcbind
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rpcbind rpc cwd DIR , /
rpcbind rpc rtd DIR , /
rpcbind rpc txt REG , /sbin/rpcbind
rpcbind rpc mem REG , /lib64/libnss_files-2.12.so
rpcbind rpc mem REG , /lib64/libc-2.12.so
rpcbind rpc mem REG , /lib64/libpthread-2.12.so
rpcbind rpc mem REG , /lib64/libdl-2.12.so
rpcbind rpc mem REG , /lib64/libgssglue.so.1.0.
rpcbind rpc mem REG , /lib64/libnsl-2.12.so
rpcbind rpc mem REG , /lib64/libtirpc.so.1.0.
rpcbind rpc mem REG , /lib64/libwrap.so.0.7.
rpcbind rpc mem REG , /lib64/ld-2.12.so
rpcbind rpc 0u CHR , 0t0 /dev/null
rpcbind rpc 1u CHR , 0t0 /dev/null
rpcbind rpc 2u CHR , 0t0 /dev/null
rpcbind rpc 3r REG , /var/run/rpcbind.lock
rpcbind rpc 4u sock , 0t0 can't identify protocol
rpcbind rpc 5u unix 0xffff88001dfc3080 0t0 /var/run/rpcbind.sock
rpcbind rpc 6u IPv4 0t0 UDP *:sunrpc
rpcbind rpc 7u IPv4 0t0 UDP *:
rpcbind rpc 8u IPv4 0t0 TCP *:sunrpc (LISTEN)
rpcbind rpc 9u IPv6 0t0 UDP *:sunrpc
rpcbind rpc 10u IPv6 0t0 UDP *:
rpcbind rpc 11u IPv6 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 表示两个参数都必须满足时才显示结果

#linux包之lsof之lsof命令的更多相关文章

  1. linux包之iproute之ss命令

    概述 [root@localhost ~]# rpm -qa|grep iprouteiproute-2.6.32-31.el6.x86_64 当服务器的socket连接数量变得非常大时,无论是使用n ...

  2. linux包之procps之sysctl命令

    概述 [root@localhost ~]# rpm -qf /sbin/sysctlprocps-3.2.8-25.el6.x86_64 我们常常在 Linux 的 /proc/sys 目录下,手动 ...

  3. #linux包之psmisc之fuser命令

    概述 [root@localhost ~]# rpm -qf /sbin/fuserpsmisc-22.6-15.el6_0.1.x86_64 先说 fuser的作用,fuser能识别出正在对某个文件 ...

  4. #linux包之tcpdump之tcpdump命令

    概述 man tcpdump 已阅 yum install tcpdump Downloading Packages:(1/2): libpcap-1.4.0-1.20130826git2dbcaa1 ...

  5. linux包之gdb之gdb命令与core文件产生

    gdb-7.2-64.el6_5.2.x86_64/usr/bin/gcore/usr/bin/gdb/usr/bin/gdb-add-index/usr/bin/gdbtui/usr/bin/gst ...

  6. linux包之iproute之ip命令

    [root@localhost ~]# rpm -qf /sbin/ipiproute-2.6.32-31.el6.x86_64ip 是个命令, ip 命令的功能很多!基本上它整合了 ifconfig ...

  7. linux包之sysstat之sar命令

    要启动SAR,必须通过cron工具以周期性的间隔启动.安装sysstat包后,默认创建一个/etc/cron.d/sysstat文件,其默认内容为:# run system activity acco ...

  8. linux包之procps之vmstat命令

    概述 [root@localhost ~]# rpm -qf /usr/bin/vmstatprocps-3.2.8-25.el6.x86_64 vmstat是一个很全面的性能分析工具,可以观察到系统 ...

  9. linux包之bash之内置命令ulimit

    概述 [root@localhost ~]# rpm -qa|grep bashbash-4.1.2-15.el6_4.x86_64 linux limits.conf 配置 limits.conf ...

  10. linux包之e2fsprogs之chattr命令

    概述 [root@localhost ~]# rpm -qf /usr/bin/chattre2fsprogs-1.41.12-18.el6.x86_64 chattr命令的作用很大,其中一些功能是由 ...

随机推荐

  1. 【转载】Java策略消除if else

    策略(Strategy)模式:又名Policy,它的用意是定义一组算法,把它们一个个封装起来,并且使他们可以相互替换.策略模式可以独立于使用他们的客户端而变化.GOF策略模式静态结构类图如下: 通过上 ...

  2. vpn探测

    root@bt:~# ike-scan -M -v 192.168.1.102 root@bt:~# sslscan 192.168.1.102

  3. Python 进度条原理

    #进度条原理 import sys,time for i in range(50): sys.stdout.write("#")#标准输出 #若不能够按照时间一个一个依次显示,则代 ...

  4. github 解决 Agent admitted failure to sign using the key

    公司迁移git 新库,重新迁移数据. 添加 ssh key  1. 首先要在新git 库管理平台 添加新的ssh-key : 本机上执行 ssh-keygen -t rsa -C "Your ...

  5. Lodop打印控件 如何打印虚线

    Lodop提供了打印设计可以方便开发人员的开发,预览是打印的反显,可以显示出打印效果,但是在开发时,还是要用虚拟打印机实际测试,(win7以上系统可能自带xps虚拟打印机 Microsoft XPS ...

  6. 用VsCode写Markdown

    Markdown 基本语法 段落 非常自然,一行文字就是一个段落. 比如: 这是一个段落 会被解释成: <p>这是一个段落.</p> 如果你需要另起一段,请在两个段落之间隔一个 ...

  7. fcitx4&period;2&period;0自定义中文标点符号

    +fcitx 定制标点 http://forum.ubuntu.com.cn/viewtopic.PHP?t=376701&p=2755636 下载punc.mb.gz放到~/.config/ ...

  8. 17秋 软件工程 第六次作业 Beta冲刺 Scrum2

    17秋 软件工程 第六次作业 Beta冲刺 Scrum2 我们组转会成员:杰麟: 我们组新成员:宏庆. 各个成员冲刺期间完成的任务 世强:完成分页功能的演示: 陈翔:完成超级管理员后端login模块: ...

  9. AngularJS学习笔记(三)数据双向绑定

    双向绑定 双向绑定是AngularJS最实用的功能,它节省了大量的代码,使我们专注于数据和视图,不用浪费大量的代码在Dom监听.数据同步上,关于双向更新,可看下图: 下面,我们通过代码来实现.先不要纠 ...

  10. 十万的License只取决于一个连接

    前段时间看到一份代码,小规模.低难度的一个应用,MVC用到极致,业务逻辑却混成一团麻,应该是中了培训班的毒.现在的程序员,大多是没仔细读过<现代操作系统>,没看过编译原理,不知道堆与栈,没 ...