昨天遇到了一个面试题--如何恢复误删除的nginx日志,当时我也只是回答出了大概的思路和步骤。晚上抽时间模拟下误删除和恢复的场景。

首先大概了解下/proc目录(记得当时考试RHCA的时候,关于这个目录的题目着实不少)。Linux系统上的/proc目录是一种文件系统,即proc文件系统,它是一种伪文件系统。里面保存了当前系统内核运行状态的一些信息,可以查看到相关的系统硬件及当前正在运行进程的相关信息,也可以通过更改其中某些文件来改变内核的运行状态。/proc/PID 保存的就是当前正在运行的进程信息,PID为进程号,当进程结束后相关目录则会消失。

恢复nginx误删除的日志就要使用到/proc/PID下的某些文件,先来看下该目录下都有哪些内容:

wKioL1XLTz3QOsBgAAdm3pfhyag181.jpg

简单列几个:

attr  进程的属性
cmdline 启动时执行的命令
cwd 当前的工作目录,软链接
environ 进程执行使用的环境变量
fd 进程打开的所有文件,文件名为文件描述符,目录中的每个软链接都指向了进程实际打开的文件
limits 进程的软硬限制
cgroup 该进程的cgroup控制组信息
status进程的运行状态信息
恢复nginx日志就是使用了fd下的某些文件描述符,因为里面每个软连接实际上都是指向了nginx运行的时候打开的文件,包括nginx的日志文件。
下边模拟下误删除并恢复日志的过程。

查看nginx的日志:

    [root@iZ2876x9bezZ ~]# ll /var/log/nginx/    total 12    -rw-r--r-- 1 root root 6991 Aug 12 12:48 access.log    -rw-r--r-- 1 root root  760 Aug 12 11:44 error.log

删除日志:

查看nginx的进程号:

查看该进程文件描述符信息:

可以看到文件描述符为5的软链接所指向的文件已经被删除,这个就是需要我们恢复的日志文件。

查看文件内容:

可以看到整个日志内容,并且新增的日志内容也会增加到该文件描述符内。接下来可以将这些日志内容输出到一个文件内,然后执行nginx的reload操作,这样可以重新生成一个access.log文件,并且新的日志内容输出到该日志文件内。