当系统中的某个文件被意外地删除了,只要这个时候系统中还有进程正在访问该文件,那么我们就可以通过lsof从/proc目录下恢复该文件的内容。假如由于误操作将/var/log/messages文件删除掉了,那么这时要将/var/log/messages文件恢复的方法如下:
首先使用lsof来查看当前是否有进程打开/var/logmessages文件,如下:
#lsof|grep/var/log/messages
syslogd1283root2wREG3,353810171773647/var/log/messages(deleted)
从上面的信息可以看到PID1283(syslogd)打开文件的文件描述符为2。同时还可以看到/var/log/messages已经标记被删除了。因此我们可以在/proc/1283/fd/2(fd下的每个以数字命名的文件表示进程对应的文件描述符)中查看相应的信息,如下:
#head-n10/proc/1283/fd/2
Aug413:50:15holmes86syslogd1.4.1:restart.
Aug413:50:15holmes86kernel:klogd1.4.1,logsource=/proc/kmsgstarted.
Aug413:50:15holmes86kernel:Linuxversion2.6.22.1-8(root@everestbuilder.linux-)(gccversion4.2.0)#1SMPWedJul1811:18:32EDT
Aug413:50:15holmes86kernel:BIOS-providedphysicalRAMmap:
Aug413:50:15holmes86kernel:BIOS-e820:0000000000000000-000000000009f000(usable)
Aug413:50:15holmes86kernel:BIOS-e820:000000000009f000-00000000000a0000(reserved)
Aug413:50:15holmes86kernel:BIOS-e820:0000000000100000-000000001f7d3800(usable)
Aug413:50:15holmes86kernel:BIOS-e820:000000001f7d3800-0000000020000000(reserved)
Aug413:50:15holmes86kernel:BIOS-e820:00000000e0000000-00000000f0007000(reserved)
Aug413:50:15holmes86kernel:BIOS-e820:00000000f0008000-00000000f000c000(reserved)
从上面的信息可以看出,查看/proc/8663/fd/15就可以得到所要恢复的数据。如果可以通过文件描述符查看相应的数据,那么就可以使用I/O重定向将其复制到文件中,如:
cat/proc/1283/fd/2>/var/log/messages