linux如何找回删除的日志
1、(\先介绍一下Linux日志文件被删除的原理,以便读者后面能对这个问题有更深的了解和意向操作。\)1、(\当进程打开了某个文件时,只要该进程保持打开该文件,即使将其删除,它依然存在于磁盘中。这意味着,进程并不知道文件已经被删除,它仍然可以向打开该文件时提供给它的文件描述符进行读取和写入。除了该进程之外,这个文件是不可见的,因为已经删除了其相应的目录索引节点。\)
2、(\ 在/proc 目录下,其中包含了反映内核和进程树的各种文件。/proc目录挂载的是在内存中所映射的一块区域,所以这些文件和目录并不存在于磁盘中,因此当我们对这些文件进行读取和写入时,实际上是在从内存中获取相关信息。大多数与 lsof 相关的信息都存储于以进程的 PID 命名的目录中,即 /proc/1234 中包含的是 PID 为 1234 的进程的信息。每个进程目录中存在着各种文件,它们可以使得应用程序简单地了解进程的内存空间、文件描述符列表、指向磁盘上的文件的符号链接和其他系统信息。\)
3、 (\ lsof 程序使用该信息和其他关于内核内部状态的信息来产生其输出。所以lsof 可以显示进程的文件描述符和相关的文件名等信息。也就是我们通过访问进程的文件描述符可以找到该文件的相关信息。 当系统中的某个文件被意外地删除了,只要这个时候系统中还有进程正在访问该文件,那么我们就可以通过lsof从/proc目录下恢复该文件的内容。\)
4、下面介绍一下假如由于误操作将/var/log/messages文件删除掉了,那么这时要将/var/log/messages文件恢复的方法如下:首先使用lsof来查看当前是否有进程打开/var/logmessages文件,如下:
5、# lsof /var/log/messagessyslogd 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/2Aug 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 2007Aug 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 对于许 多应用程序,尤其是日志文件和数据库,这种恢复删除文件的方法非常有用。
6、为了方便大家对linux下文件数字代表认识 如下:1.普通的文件,2.目录 3.网络文件系统的文件,4.字符设备文件 5.(函数)共享库 6.管道,命名管道 7.符号链接 8.底层的socket字流,网络socket,unix域名socket;
7、lsof常用参数lsof 谱驸扌溺列车所有打开的文件lsof /filepath/file (查看谁正在使用某个文件)lsof -c abc (显示abc进程现在打开的文件)lsof 幻腾寂埒-p 1234 (列出进程号为1234的进程所打开的文件)lsof -g gid( 显示归属gid的进程情况)lsof +d /usr/local/ (显示目录下被进程开启的文件 lsof +D /usr/local/ 同上,但是会搜索目录下的目录,时间较长)lsof -d 4 (显示使用fd为4的进程)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 -c mysql (列出某个程序所打开的文件信息,备注: -c(command) 选项将会列出所有以mysql开头的程序的文件)以上数据库是Mysql,如果是Sqlserver数据库也可以做参考,MicrosoftOfficeAccess数据库用于office一套,一般不会嵌入到linux环境下。
8、看懂输出信息含义lsof 输出各列信息的意义如下:“COMMAND”:进程的名称 PID:进程标识符”USER”:进程所有者”FD”:文件描述符,应用弛贾班隧程序通过文件描述符识别该文件。如cwd、txt等 ””TYPE”:文件类型,如DIR、REG等”DEVICE”:指定磁盘的名称”SIZE”:文件的大小”NODE”:索引节点(文件在磁盘上的标识)”NAME”:打开文件的确切名称”FD ”列中的文件描述符cwd 值表示应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改,txt 类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序。